您是不是需要在 .Add() 之前加载实体框架集合的内容?

Posted

技术标签:

【中文标题】您是不是需要在 .Add() 之前加载实体框架集合的内容?【英文标题】:Do you need to load contents of Entity Framework collection before you .Add() to it?您是否需要在 .Add() 之前加载实体框架集合的内容? 【发布时间】:2013-01-14 19:34:24 【问题描述】:

我有一个实体模型

class Package

...

    virtual ICollection<Owner> Owners  get; set; 

并且正在实施AddOwner() 操作。

实体框架是否要求我使用.Include(p =&gt; p.Owners) 检索我的包对象包括所有者,以便我调用p.Add(newOwner);并将更改保存回数据库?

次要问题:直觉并没有引导我在这里找到答案,因为我不知道我的直觉是基于 CLR 集合还是基于实体框架的某些原则;是否有 EF 的原则可以帮助我更好地理解事物而不是思考 CLR 集合?

【问题讨论】:

【参考方案1】:

只要您的Package 对象附加到上下文,Owners 属性就会设置为EntityCollection&lt;Owner&gt;。无论是否加载,通过该属性所做的更改都将被标记为您的上下文中的更改,SaveChanges() 将保存这些更改。

请记住,您的 Owner 对象已经需要成为上下文的一部分,如果它是现有所有者的话。如果不是,EF 将假定您正在尝试保存一个新的Owner

【讨论】:

所以底线是没有必要调用 .Include(p => p.Owners ) 对吗? @TimLovell-Smith 只要您没有其他依赖于 Owners 加载的代码,对,这不是必需的。 EF 方面的唯一变化是在调用 SaveChanges() 之前不会检测到密钥违规(重复的 Owners)。【参考方案2】:

业主迟早必须指出具体的东西,当然在你尝试添加任何东西之前。 EF 知道通过 ICollection 接口查看此属性。

你可以这样做:

var p = new Package  SomePackageProperty = "Some value",
Owners = new List<Owner>>()  new Owner  SomeOwnerProperty = "Some other value"   ;

yourContext.DbSet<Package>().Add(p);

但这只是一个最好的猜测,考虑到问题中提供的小 sn-p。

【讨论】:

【参考方案3】:

我认为您正在考虑包括 Owners .Include(p => p.Owners),然后说 p.Owners.Add(new_owner) 添加新的 Owner,这将在 .SaveChanges 之后起作用。

【讨论】:

以上是关于您是不是需要在 .Add() 之前加载实体框架集合的内容?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架查询——加载数据优化

集合框架(01)

从实体框架中的集合加载相关实体

实体框架 - 通过集合导航和包含属性

实体框架检查属性是否为导航属性

实体框架和预先加载以及使用 DDD 方法的企业应用程序