如何在Entity Framework中消除循环引用?

8

我的客户和订单实体之间的循环引用导致序列化过程中出现异常。有没有办法强制EF在这两个实体之间生成单向引用?提前感谢!

6个回答

14

当我需要序列化时,通常会将数据投影到其他类型上。这样可以消除循环引用,还可以过滤掉我不想序列化的其他数据。例如:

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);

5
当你在模型设计师中创建一个关联(右键添加->关联)时,你会得到一个弹出窗口,看起来像这样:

Add association window

请注意导航属性复选框,如果您不希望它们被生成,请取消选择。为解决循环引用问题,请确保仅选中一个或不选中任何一个。

抱歉,我不太明白你说的话。你能更明确地表达一下吗?谢谢! - Roy
谢谢Charlie,但我看不到图片。而且我的设计师上面没有复选框。 :( 我正在使用Visual Studio 2008。 - Roy
好的,我正在使用VS2010 beta 2上的Entity Framework 4.0...也许在旧版本的EF中无法完成此操作。 - Charlie
2
在3.5 SP1中,您无法使用设计器删除导航属性,必须从EDMX文件内的ConceptualModel部分中删除它们。但是我认为Craig的答案更好。您不一定要更改模型来解决序列化问题。通过更改模型,您只能做到这么多。 - Alex James
@Charlie,James:非常感谢。我将在我的项目中添加Dto。 - Roy
@Alex James。没错,我也同意这个,Craig的解决方案更可取。 - Charlie

5

我曾在EF 3.5中解决过这个问题,方法是将子对象的导航属性Getter从public改为internal。


谢谢,这对我有用。虽然我不完全确定这是否是正确的方法! - Tom Hall

1
在服务器层面上:
[DataContract(IsReference = true)] 

{{链接1:MSDN}}


0

3
请注意,仅链接答案不受欢迎,Stack Overflow上的答案应该是搜索解决方案的最终点(而不是引用的另一个停留点,这些引用往往会随时间变得陈旧)。请考虑在此处添加独立的概述,并将链接作为参考。 - kleopatra

0

将子导航的getter更改为internal,我在Web API v2下使用entity framework v5/v6成功实现了。


它修复了Web API的帮助,但破坏了序列化。 - marcusdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接