实体框架在.Include之后返回无限个实体引用



我在实体框架方面遇到问题,如果我包括一个实体,例如我有:

  • 有外键引用的实体A:

  • 实体B

如果我运行实体框架查询并执行.Include("实体B"),我的结果实体(实体a)的属性为.Entity B.好吧,这很好,这就是我所期望的。但是!

实体B有一个被填充的实体A属性,然后有一个实体B属性被填充,然后有实体A属性被填充并继续下去。

实体框架为什么要这样做?这似乎是浪费,并且由于这些实体的所有不必要的物化,返回的实体的大小要大得多。

我肯定在某个地方错过了一些场景。有什么想法吗?

此行为按设计工作。从技术上讲,这是一个循环引用。

正如CodeCaster提到的,有相同的对象。类似的结果可以用以下源代码模拟:

class A {
   public B BReference { get; set; }
}
class B {
   public A AReference { get; set; }
}
static class Program 
{
    [STAThread]
    public static void Main()
    {
        A a = new A();
        B b = new B();
        b.AReference = a;
        a.BReference = b;
        // you should have b.AReference == a and
        // a.Breference == b
    }
}

当从数据库加载数据时,实体框架也会执行同样的操作。这取决于你确保你不会深入其中。

尝试防止这些场景总是一个好主意,因为它们会造成很多麻烦(在SO上寻找循环引用…),尤其是在将这些类用于API或序列化时。

无论如何,EF或其他映射工具都使用了这种构造,并且在编码时非常方便。

最新更新