2011-10-08 76 views
0

我在我的數據庫中有3個表 - Conference,ActivityTypes和加入表ConferenceActivities。每個會議可能有零個或多個標準活動,每個活動可能發生在零個或多個會議中。如何json seralize實體框架多對多沒有循環參考的關係

會議(ConferenceID,ConferenceName)

ConferenceActivities(ConferenceID,ActivityTypeID)

ActivityTypes(ActivityTypeID,ActivityTypeDesc)

我使用實體框架在我現有的數據庫,與在該.TT模板MVC3的應用程序,我生成了一個DbContext和POCO對象,注意它只產生兩個對象,ActivityTypeConference這很好,它似乎理解中介表。

它還增加了活動的集合,我會

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,腳手架和模板。

是我試圖實現的東西,應該開箱即用?如果是的話,我可能會錯過哪些設置,如果沒有,那麼這裏最好的做法是什麼 - 我知道我可以做這項工作的唯一方法是自己手動建立對象。

建議或鏈接到完整的工作演示(我見過很多建議和代碼片段,似乎不工作!!)讚賞。我肯定有人這樣做,並確保它的工作。

回答

0

不要傳遞你的模型類。使用視圖所需的數據創建視圖模型,或者在您的情況下創建json輸出。我看到你試圖將它投影到一個匿名類型中,但將它投影到一個具體的視圖模型中,它應該完美地工作。