Entity framework 在将.Add()添加到实体框架集合之前,是否需要加载该集合的内容?

Entity framework 在将.Add()添加到实体框架集合之前,是否需要加载该集合的内容?,entity-framework,collections,orm,Entity Framework,Collections,Orm,我有一个实体模型 class Package { ... virtual ICollection<Owner> Owners { get; set; } } 类包 { ... 虚拟ICollection所有者{get;set;} } 我正在执行一个AddOwner()操作 实体框架是否要求我检索包对象,包括具有.Include(p=>p.owner)的所有者,以便调用p.Add(newOwner);并将更改保存回数据库 第二个问题:直觉并没有引导我在这里找到答案,因为我

我有一个实体模型

class Package
{
...

    virtual ICollection<Owner> Owners { get; set; }
}
类包
{
...
虚拟ICollection所有者{get;set;}
}
我正在执行一个
AddOwner()
操作

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


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

所有者迟早会指出一些具体的东西,当然,在你尝试添加任何东西之前。EF知道如何通过ICollection接口查看此属性

您可以执行以下操作:

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

yourContext.DbSet<Package>().Add(p);
var p=new Package{SomePackageProperty=“Some value”,
所有者=新列表>(){newowner{SomeOwnerProperty=“someother value”}};
yourContext.DbSet().Add(p);

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

我认为您考虑的是包括owner.Include(p=>p.owner),然后说p.owner.Add(new_owner)来添加一个新的所有者,它将在.SaveChanges之后工作。

只要您的
对象附加到上下文,
所有者
属性将设置为
EntityCollection
。无论是否加载,通过该属性所做的更改都将标记为上下文中的更改,
SaveChanges()
将保存这些更改


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

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