您是不是需要在 .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 => p.Owners)
检索我的包对象包括所有者,以便我调用p.Add(newOwner)
;并将更改保存回数据库?
次要问题:直觉并没有引导我在这里找到答案,因为我不知道我的直觉是基于 CLR 集合还是基于实体框架的某些原则;是否有 EF 的原则可以帮助我更好地理解事物而不是思考 CLR 集合?
【问题讨论】:
【参考方案1】:只要您的Package
对象附加到上下文,Owners
属性就会设置为EntityCollection<Owner>
。无论是否加载,通过该属性所做的更改都将被标记为您的上下文中的更改,SaveChanges()
将保存这些更改。
请记住,您的 Owner
对象已经需要成为上下文的一部分,如果它是现有所有者的话。如果不是,EF 将假定您正在尝试保存一个新的Owner
。
【讨论】:
所以底线是没有必要调用 .Include(p => p.Owners ) 对吗? @TimLovell-Smith 只要您没有其他依赖于Owners
加载的代码,对,这不是必需的。 EF 方面的唯一变化是在调用 SaveChanges()
之前不会检测到密钥违规(重复的 Owner
s)。【参考方案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() 之前加载实体框架集合的内容?的主要内容,如果未能解决你的问题,请参考以下文章