Entity framework 实体框架6-使用不';在数据库中还不存在
假设一家公司有员工。公司“解决方案”有员工“詹姆斯” 这些实体都保存在数据库中,它们的关系通过外键表示 在应用程序级别,Employee类有一个Company对象属性来定义关系 假设创建了一家新的公司“更好的解决方案”,而这家公司在DB中还不存在,James现在搬到了这家公司 我该如何告诉EF处理这件事?目前我: 将新公司的“更好的解决方案”(使用GUID ID创建的对象)保存到数据库:Entity framework 实体框架6-使用不';在数据库中还不存在,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,假设一家公司有员工。公司“解决方案”有员工“詹姆斯” 这些实体都保存在数据库中,它们的关系通过外键表示 在应用程序级别,Employee类有一个Company对象属性来定义关系 假设创建了一家新的公司“更好的解决方案”,而这家公司在DB中还不存在,James现在搬到了这家公司 我该如何告诉EF处理这件事?目前我: 将新公司的“更好的解决方案”(使用GUID ID创建的对象)保存到数据库: db.Companies.Add(newCompany); 更改Jame实例上的公司属性: james.C
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
在这种情况下,我是否需要首先将NewcomCompany对象推送到DB,然后从DB检索它(以获取新ID),然后将检索到的对象设置为James的公司属性
或者EF是否有一种更干净的方式来处理这些问题?试着像下面这样做。首先保存公司,然后将其分配给james,james将更新现有员工
db.companys.Add(新公司);
db.SaveChanges();
詹姆斯公司=新公司;
db.SaveChanges()代码>所以这里你要做的是1。将新公司插入数据库。然后调用SaveChanges 2。插入后,newcompany对象将使用正在生成的id 3进行更新。然后将新公司id分配给员工,或直接将新公司分配给员工并保存更改。这会让员工拥有公司的财产吗?哦,谢谢,这很简单。我遇到的问题是业务逻辑和DAL级别之间的映射,因此当我返回到业务逻辑时,自动更新的新ID丢失了。但这是我需要解决的问题。请注意,这不是事务性的。@GertArnold。而且更像是快速而肮脏的变通办法,而不是解决办法。@IvanStoev我同意。我更愿意用存根实体来制定一个解决方案,但这需要更多的时间(我现在没有)。