如何删除实体框架中的循环引用?

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 服务中返回的第一级子项下的引用暴露实体框架数据模型?

如何正确遍历删除List中的元素(普通for循环增强for循环迭代器iteratorremoveIf+方法引用)

实体框架中的多对多关系导致无限循环