为什么将EntityState设置为Detached清空List <T>类型的属性?

Eri*_* J. 8 entity-framework-4 ef-code-first

使用实体框架代码首先,我有类似的东西:

public class Foo
{
    public int Id { get; set; }

    public List<Bar> Bars { get; set; }
}    

Foo foo = (from f in ctx.Foos.Include("Bars") where f.Id == 42 select f).Single();

// At this point foo.Bars is populated

ctx.Entry(foo).State = EntityState.Detached;

// At this point foo.Bars is an empty List
Run Code Online (Sandbox Code Playgroud)

为什么分离一个对象导致它的属性public List<string> Bars(明确且成功地包含在内)被清空?

分离可能具有许多属性的对象的正确过程是什么?

Sla*_*uma 11

清单清空的原因是实体框架中两个规则的组合:

  1. 当您分离对象时,此对象本身将被分离,而没有任何导航属性引用的对象.

  2. ObjectContext/ DbContext不允许持有被部分地附接到上下文和部分分离的对象图.虽然这可以作为一个临时状态使用时发生波苏斯EF将总是通过各种方法(如内部图中的自动粘贴分离对象解决这个临时状态Add,Attach,设置一个实体的状态等)或最新时SaveChanges被调用.

这意味着当您从上下文中分离根对象时,EF将清除子项列表,因为:a)子项保持连接(规则1)和b)不允许在图中混合使用分离和附加对象(规则) 2).

据我所知,在保持原始树结构的同时,无法从上下文中分离对象图.你可以一个接一个地分离父母和子女.因此,您已从上下文中分离树的所有对象,但树同时被销毁 - 每个导航属性都无效.

手动分离实体的主要目的是在存在内存资源限制且不希望并且需要在上下文中保存大量对象的情况下释放它们以进行垃圾回收.为此目的,图形结构被破坏并不重要.

我不知道你为什么需要从上下文中分离对象.但请记住,还有从数据库加载实体的选项,而不是首先将它们附加到上下文中,如使用AsNoTracking().

关于MSDN文档的一些参考问题的另一个答案是:https://stackoverflow.com/a/7693732/270591