gpt4 book ai didi

entity-framework-4 - 为什么将EntityState设置为“分离为空”,类型为List 的属性?

转载 作者:行者123 更新时间:2023-12-04 06:43:40 27 4
gpt4 key购买 nike

首先使用实体​​框架代码,我有类似以下内容:

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(已明确并成功包含)被清空?

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

最佳答案

清空列表的原因是Entity Framework中的两个规则的组合:

  • 分离对象时,仅分离该对象本身,而没有任何导航属性引用的对象。
  • ObjectContext/DbContext不允许保存对象图,该对象图部分附加到上下文且部分分离。尽管在使用POCO时这可能会作为临时状态发生,但EF会始终通过在各种方法(例如AddAttach,设置实体的状态等)内自动将分离的对象附加到图形中来修复此临时状态,或者在SaveChanges时最晚修复此临时状态。叫做。

  • 这意味着,当您从上下文中分离根对象时,EF会清除子级列表,因为:a)子级保持连接状态(规则1),并且b)不允许在图中混合使用分离的对象和连接的对象(规则) 2)。

    据我所知,在保持原始树结构的同时,没有办法从上下文中分离对象图。您可以彼此分离 parent ,然后再分离 child 。结果,您已经从上下文中分离了树的所有对象,但是树同时被破坏了-每个导航属性都无效。

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

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

    有关此问题的一些答案,其中包含对MSDN文档的一些引用: https://stackoverflow.com/a/7693732/270591

    关于entity-framework-4 - 为什么将EntityState设置为“分离为空”,类型为List <T>的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10342445/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com