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

C# 实体框架在.Include之后返回无限实体引用,c#,entity-framework,C#,Entity Framework,我对实体框架有一个问题,如果我包括一个实体,例如,我有: 具有外键引用的实体A: 实体B 如果我运行实体框架查询并执行.Include(“实体B”),我的结果实体(实体a)的属性为.Entity B。好的,这就是我所期望的。但是 然后,实体B有一个填充的实体A属性,该实体B属性有一个填充的实体B属性,该实体B属性有一个填充的实体A属性,该属性不断填充 实体框架为什么要这样做?这看起来很浪费,而且由于这些实体的所有不必要的物化,返回的实体的大小要大得多 我肯定错过了什么地方。伙计们,有什么想法

我对实体框架有一个问题,如果我包括一个实体,例如,我有:

  • 具有外键引用的实体A:

  • 实体B

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

然后,实体B有一个填充的实体A属性,该实体B属性有一个填充的实体B属性,该实体B属性有一个填充的实体A属性,该属性不断填充

实体框架为什么要这样做?这看起来很浪费,而且由于这些实体的所有不必要的物化,返回的实体的大小要大得多


我肯定错过了什么地方。伙计们,有什么想法吗?

这种行为符合设计要求。从技术上讲,这是一个错误

如前所述,有相同的对象。可以使用以下源代码模拟类似的结果:

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
    }
}
从数据库加载数据时,实体框架也会这样做。这取决于你,以确保你不陷入太深

尝试阻止这些场景总是一个好主意,因为它们会带来很多麻烦(请查找循环引用等等),尤其是在将这些类用于API或序列化时


无论如何,EF或其他映射工具使用这种结构,编码时非常方便

它们只是彼此的引用,两个对象只存在一次。您没有提到在什么上下文中序列化它们。例如,或者你可以,等等。谢谢你的回复。我在.edmx设计器中的任何实体上都看不到“IsReference”属性。因此,您的意思是,当我在intellisense中遍历扩展实体时,它们不是相同数据的实际副本,只是对一个实体的引用。。。A->B->A->B->A->B,所以每个都没有3个副本,只是指向第一个“A”和“B”的指针?就是这样。:)非常感谢您的回复。