我在我的數據庫中有3個表 - Conference
,ActivityTypes
和加入表ConferenceActivities
。每個會議可能有零個或多個標準活動,每個活動可能發生在零個或多個會議中。如何json seralize實體框架多對多沒有循環參考的關係
會議(ConferenceID,ConferenceName)
ConferenceActivities(ConferenceID,ActivityTypeID)
ActivityTypes(ActivityTypeID,ActivityTypeDesc)
我使用實體框架在我現有的數據庫,與在該.TT模板MVC3的應用程序,我生成了一個DbContext和POCO對象,注意它只產生兩個對象,ActivityType
和Conference
這很好,它似乎理解中介表。
它還增加了活動的集合,我會
public virtual ICollection<ActivityType> ActivityTypes { get; set; }
和會議,以我的活動的集合。
public virtual ICollection<Conference> Conferences { get; set; }
我想返回使用JSON匹配特定會議的對象..包括ActivityTypes。有些人可能會將此對象描述爲「形」或「鋸齒」,因爲它內有一個集合。
雖然我已經嘗試了許多不同的變體,但我的語法錯誤,但我仍然得到關於遞歸的運行時錯誤,我使用的代碼如下所示。
public JsonResult GetConference(int conferenceId)
{
Conference x = context.Conferences.Include("ActivityTypes").FirstOrDefault<Conference>(i => i.EventID == eventId);
return Json(x, JsonRequestBehavior.AllowGet);
}
這似乎並沒有工作「開箱即用」,我看到了很多,似乎相關堆棧溢出的問題,但儘管多次嘗試不同的方法,但所有創建有關遞歸或參數構造函數的錯誤。我開始懷疑這是否可能。
我試圖連接[IgnoreDataMemberAttribute]
或[ScriptIgnore]
不同的屬性,以阻止它試圖連載遞歸關係(我認爲形式是無關緊要的,但是當你絕望..),我仍然得到同樣的錯誤。
我試過這種方法生成的參數的誤差
var thing = from r in context.Conferences
select new
{
r.ConferenceID,
r.ConferenceName,
ActivityTypes = new List<ActivityType>(
(from c in r.ActivityTypes
select new ActivityType()
{
ActivityTypeDesc = c.ActivityTypeDesc,
ActivityTypeID = c.ActivityTypeID
}).Cast<ActivityType>())
};
return Json(thing, JsonRequestBehavior.AllowGet);
另一項建議是在模型上Lazy Loading Enabled
屬性設置爲false ..這沒有什麼區別我仍然得到遞歸誤差。
我試着刪除Virtual
關鍵字,我相信關閉懶惰加載..並試圖與.Include(..)但再次沒有喜悅。
另一個建議是將訪問者從public
更改爲internal
但是這與序列化沒有區別。
有人還建議從ActivityType類中刪除會議的集合,而不是我想要做的事情......但這樣做只會產生一個錯誤`指定的Schema無效。無論如何。
我正在使用我相信最新版本nuget和相關的EF,腳手架和模板。
是我試圖實現的東西,應該開箱即用?如果是的話,我可能會錯過哪些設置,如果沒有,那麼這裏最好的做法是什麼 - 我知道我可以做這項工作的唯一方法是自己手動建立對象。
建議或鏈接到完整的工作演示(我見過很多建議和代碼片段,似乎不工作!!)讚賞。我肯定有人這樣做,並確保它的工作。