实体框架6 - 使用尚未存在于DB中的对象的表单关系

时间:2017-05-17 11:06:24

标签: entity-framework entity-framework-6

假设公司有员工。公司'解决方案'有员工'詹姆斯'

这些实体都保存在数据库中,它们的关系通过外键表示。

在应用程序级别,Employee类具有Company对象属性,用于定义关系。

假设一家新公司' Better Solutions'已创建,但尚未存在于数据库中,詹姆斯现在转移到该公司。

如何告诉EF处理此问题?目前我:

保存新公司' Better Solutions' (使用GUID ID创建的对象)到DB:

db.Companies.Add(newCompany);

更改Jame实例上的公司属性:

james.Company = newCompany;

告诉EF James实例上的某个属性已更改并需要更新:

db.Employees.Attach(james);
db.Entry(james).State = System.Data.Entity.EntityState.Modified;

但是当发生这种情况时,newCompany对象还没有新的数据库ID(即使它已被添加到数据库中,该对象仍保留GUID ID),所以当保存EF尝试执行此操作时:

UPDATE [dbo].[Employee]
SET [CompanyID] = SomeGUID, 
WHERE ([EmployeeID] = JamesID)

当然会抛出异常,因为没有CompanyID与GUID匹配:

The UPDATE statement conflicted with the FOREIGN KEY constraint

在这种情况下,我是否需要先将newCompany对象推送到DB,然后从DB中检索它(以获取新ID),然后将此检索对象设置为James的公司属性?

或者EF有更清洁的方式来处理这一切吗?

1 个答案:

答案 0 :(得分:1)

尝试如下所示。首先保存公司,然后将其分配给将更新现有员工的詹姆斯。

db.Companies.Add(newCompany); db.SaveChanges(); james.Company = newCompany; db.SaveChanges();