在EF中添加一个具有现有父级的新记录

3
我正在使用Entity Framework处理一组包含3个不同表的层次结构,以公寓单元->公寓大楼->业主组织为例。每个表都有一个主键和一个外键指向其所有者在数据库中的位置。当我构建EF模型时,它为每个表创建了属性。确实,保存每个实例非常容易。例如,我还学会了添加新单元的方法:首先需要添加一个组织,将其添加到新的大楼中,然后将其添加到新单元中,最后再保存。这有点麻烦,但很合理。
现在让我困惑的是,我有一个新的公寓单元,但它位于现有的大楼中。我可以使用适当的属性构建一个新的大楼对象,并将其附加到新的单元上,但是当我尝试保存该单元时,框架会在apartmentComplex表中抛出一个主键冲突,因为它试图将我附加的大楼作为新大楼添加,而不是现有的大楼。
对我来说,解决方法似乎是首先去检索现有的大楼实例,而不是自己构建一个 - 实际上,让EF来构建它,而这需要另一轮回传,似乎有些过度。是否有更简单的方法来保存我的新公寓单元?

我模糊地记得EF会同时构建到父对象的链接和ID字段本身。因此,您的ApartmentUnit对象应该同时包含“Complex”和“ComplexID”。只需添加一个新的ApartmentUnit对象并设置其ComplexID字段(不触及Complex链接),然后保存即可。 - Stephen Chung
1个回答

2

您可以在不访问数据库的情况下创建现有复杂对象,但必须在保存之前将其附加到上下文中。

Complex existingComplex = new { ID = 1234 };
entitiesContext.AttachTo("Complexes", existingComplex);
newAppartment.Complex = existingComplex;
entitiesContext.SaveChanges();

我需要构建整个对象,还是只需像你所做的那样放入主键? - Mike K
就像我的例子一样,你只需要提供必要的主键来附加到上下文中。 - Fabian Nicollier
1
这次接近成功了,但我收到了一个异常,指示EntityKey为空。根据https://dev59.com/HHRB5IYBdhLWcg3wLUq3的建议,我将它从context.Attach(existingComplex)更改为context.AttachTo("Complexes", existingComplex)。然后它就可以工作了。 - Mike K
你说得对,是我的错误。我会编辑我的帖子以反映这一点。 - Fabian Nicollier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接