【问题标题】:How to remove circular reference in Entity Framework?如何删除实体框架中的循环引用?
【发布时间】:2010-01-21 07:25:06
【问题描述】:

我的 Customer 和 Order 实体之间的循环引用导致序列化期间出现异常。有什么方法可以强制 EF 在这两个实体之间生成单向引用?提前致谢!

【问题讨论】:

    标签: .net entity-framework orm


    【解决方案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 帮助但终止了序列化
        猜你喜欢
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多