从databasecontext中分离EF对象以避免循环引用

时间:2011-11-03 22:26:46

标签: c# asp.net entity-framework

基于Wes Grants在这个帖子中回答:Serializing Entity Framework problems

我尝试了以下代码:

string sid = HttpContext.Current.Request["Sid"];
SYSTEM system = context.SYSTEM.Where(s => s.SYSTEM_ID.Contains(sid)).First();

context.Detach(system);

HttpContext.Current.Response.Write(serializer.Serialize(system));

但我仍然得到循环引用异常。我错过了一些明显的东西吗?感谢

1 个答案:

答案 0 :(得分:0)

如果您使用的是EntityObjects而不是POCO,则无法执行此操作。原因是如果您的SYSTEM类型派生自EntityObject,它会继承一些也将被序列化的属性。请参阅herehere

解决方案是

  • 切换到使用POCO而不是EntityObjects
  • 编写您自己的转换器,如您链接的SO问题中所述
  • 使用JavaScriptSerializer
  • 将您的查询投射到匿名类型和serialize those
  • 将您的实体映射到数据传输对象(DTO;原则上它们是数据协定)并传输这些对象

编辑:

如果您已经在使用POCO,原因可能是EF内部为您的POCO创建了proxy classes,以便更改跟踪和延迟加载。这些代理类是动态创建的,可能导致序列化失败。