使用实体框架代码首先,我有类似的内容:
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
为什么分离一个对象导致它的属性public List<string> Bars
被明确且成功地包括在内?
分离可能包含许多属性的对象的正确步骤是什么?
答案 0 :(得分:11)
列表清空的原因是实体框架中两个规则的组合:
当您分离对象时,只有这个对象本身被分离,而没有任何导航属性引用的对象。
ObjectContext
/ DbContext
不允许保存部分附加到上下文并部分分离的对象图。虽然这可以在使用POCO时作为临时状态发生,但EF将始终通过在各种方法(如Add
,Attach
中自动附加图中的分离对象来设置实体的状态来修复此临时状态。 ,等等)或调用SaveChanges
时的最新信息。
这意味着当您从上下文中分离根对象时,EF将清除子项列表,因为:a)子项保持连接(规则1)和b)图形中混合的分离和附加对象不是允许(规则2)。
据我所知,在保持原始树结构的同时,无法从上下文中分离对象图。你可以一个接一个地分离父母,然后分开孩子。因此,您已从上下文中分离了树的所有对象,但树同时被销毁 - 每个导航属性都无效。
手动分离实体的主要目的是在存在内存资源限制并且不希望并且需要在上下文中保存大量对象的情况下释放它们以进行垃圾回收。为此目的,图形结构被破坏并不重要。
我不知道你为什么需要从上下文中分离对象。但请记住,还可以选择从数据库加载实体,而不是首先将它们附加到上下文中,例如使用AsNoTracking()
。
有关MSDN文档的一些参考问题的另一个答案是:https://stackoverflow.com/a/7693732/270591