I get an error as below:
'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.
I have a table called MenuItems in my database. The fields and relationships in MenuItems is displayed in the image below:
The Class for this table generated by entity framework is as follows:
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; }
}
I searched for the above error on internet and everywhere I get the same solution of applying DataMember attribute to the members of the class.So I have done that. Here is the modified 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; }
}
But still I get the same error. Can anybody suggest me some workaround?
Update:
If I use the below method to return all the menuitems it works fine:
public IEnumerable<MenuItem> GetAllMenuItems()
{
using (Entities db = new Entities())
{
return (from m in db.MenuItems
select m).ToList();
}
}
The moment I change it to something like :
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();
}
}
I get another error:
The entity or complex type 'Models.MenuItem' cannot be constructed in a LINQ to Entities query.
you may ask me to write code like below:
return (from m in db.MenuItems
select new
{
MenuItemID = m.MenuItemID,
Title = m.Title,
ParentID = m.ParentID
}).ToList();
Then what should be the return type of my method?