如何删除实体框架中的循环引用?
Posted
技术标签:
【中文标题】如何删除实体框架中的循环引用?【英文标题】:How to remove circular reference in Entity Framework? 【发布时间】:2010-01-21 07:25:06 【问题描述】:我的 Customer 和 Order 实体之间的循环引用导致序列化期间出现异常。有什么方法可以强制 EF 在这两个实体之间生成单向引用?提前致谢!
【问题讨论】:
【参考方案1】:当我需要序列化时,我通常会投影到其他类型上。这消除了循环引用,以及我不想序列化的其他数据。例如:
var q = (from c in Repository.Customers()
where c.Id == id
select new
Name = c.Name,
Orders = from o in C.Orders
select new
Date = o.Date
).First();
return Json(q);
【讨论】:
【参考方案2】:我已经在 EF 3.5 中解决了这个问题,方法是将 Child 的导航属性 Getter 从 public 更改为 Internal。
【讨论】:
谢谢,这对我有用。不完全确定这是否是正确的方法!【参考方案3】:当您在模型设计器中创建关联时(右键单击添加->关联),您将看到如下所示的弹出窗口:
注意导航属性复选框,如果您不想生成它们,可以取消选择它们。要解决循环引用问题,请确保只选中一个或一个都不选中,而不是两个都选中。
【讨论】:
对不起,我听不懂你说的话。你能说得更具体一点吗?谢谢! 谢谢查理,但我看不到图片。而且我的设计师没有复选框。 :( 我使用的是 Visual Studio 2008。 好的,我在 VS2010 beta 2 上使用 Entity Framework 4.0...也许这在旧版本的 EF 中无法做到。 在 3.5 SP1 中,您无法使用设计器删除导航属性,您必须求助于从 EDMX 文件内 XML 的 ConceptualModel 部分中删除它们。但是我认为克雷格的回答要好得多。您不一定要更改模型来解决序列化问题。通过改变模型,你能做的只有这么多。 @Charlie, James:非常感谢。我要把 Dto 添加到我的项目中。【参考方案4】:在服务器级别:
[DataContract(IsReference = true)]
MSDN
【讨论】:
【参考方案5】:观看此页面 我希望我能活下来http://msdn.microsoft.com/en-us/data/jj574232.aspx
【讨论】:
请注意,link-only answers are discouraged,SO 答案应该是搜索解决方案的终点(相对于另一个参考中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。【参考方案6】:在 Web API v2 下使用实体框架 v5/v6 将子导航更改为内部的 getter 对我有用
【讨论】:
它修复了 web api 帮助但终止了序列化以上是关于如何删除实体框架中的循环引用?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理循环引用 - 或 - 在 WCF 服务中返回的第一级子项下的引用暴露实体框架数据模型?