2014-03-01 157 views
1

循環引用錯誤我得到一個錯誤如下:獲得在實體框架

'Object graph for type 'System.Collections.Generic.HashSet`1[[ERP_Lite_Data. 
MenuItem, ERP_Lite_Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' 
contains cycles and cannot be serialized if reference tracking is disabled. 

我有我的數據庫中的表叫的MenuItems。在的MenuItems的字段和關係被顯示在下面的圖片:

enter image description here

用於通過實體框架生成該表中的類如下:

public partial class MenuItem 
{ 
    public MenuItem() 
    { 
     this.MenuItems1 = new HashSet<MenuItem>(); 
    } 

    public int MenuItemID { get; set; } 
    public string Title { get; set; } 
    public Nullable<int> ParentID { get; set; } 

    public virtual ICollection<MenuItem> MenuItems1 { get; set; } 
    public virtual MenuItem MenuItem1 { get; set; } 
} 

我搜索互聯網上的上述錯誤並且在任何地方我都可以獲得將DataMember屬性應用於類成員的相同解決方案。因此,我已經完成了這一任務。這是修改過的MenuItem.cs。

[DataContract]  
public partial class MenuItem 
{ 
    public MenuItem() 
    { 
     this.MenuItems1 = new HashSet<MenuItem>(); 
    } 

    [DataMember, Key] 
    public int MenuItemID { get; set; } 

    [DataMember] 
    public string Title { get; set; } 

    [DataMember] 
    public Nullable<int> ParentID { get; set; } 

    [DataMember] 
    public virtual ICollection<MenuItem> MenuItems1 { get; set; } 

    [DataMember] 
    public virtual MenuItem MenuItem1 { get; set; } 
} 

但是我仍然得到同樣的錯誤。任何人都可以提出一些解決方法嗎?

更新:

如果我用下面的方法來返回所有的菜單項正常工作:

public IEnumerable<MenuItem> GetAllMenuItems() 
{ 
    using (Entities db = new Entities()) 
    { 
     return (from m in db.MenuItems 
       select m).ToList(); 
    } 
} 

我將其更改爲類似的時刻:

public IEnumerable<MenuItem> GetAllMenuItems() 
{ 
    using (Entities db = new Entities()) 
    { 
     return (from m in db.MenuItems 
       select new MenuItem 
       { 
        MenuItemID = m.MenuItemID, 
        Title = m.Title, 
        ParentID = m.ParentID 
       }).ToList(); 
    } 
} 

我得到另一個錯誤:

The entity or complex type 'Models.MenuItem' cannot be constructed in a LINQ to Entities query. 

你可能會問我寫的代碼象下面這樣:

return (from m in db.MenuItems 
     select new 
     { 
      MenuItemID = m.MenuItemID, 
      Title = m.Title, 
      ParentID = m.ParentID 
     }).ToList(); 

那麼什麼應該是我的方法的返回類型?

回答

2

當談到序列化時,最着名的問題就在那裏。將projection用於某些沒有此類引用的類型,並避免出現異常。

換句話說,只需從EF模型中選取所需的屬性,不要添加嵌套複雜類型的字段,該類型也具有指向同一對象的屬性,從而創建循環引用。

+0

我是實體框架的新手,你能解釋一下數據傳輸類型是什麼意思嗎? – Vishal

+0

我修改了我的回覆。 –

+0

好吧,不同投影的含義是我不應該使用全選(*),而應該使用列名選擇即使我想選擇所有列? – Vishal