Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架6-使用不';在数据库中还不存在_Entity Framework_Entity Framework 6 - Fatal编程技术网

Entity framework 实体框架6-使用不';在数据库中还不存在

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

假设一家公司有员工。公司“解决方案”有员工“詹姆斯”

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

在应用程序级别,Employee类有一个Company对象属性来定义关系

假设创建了一家新的公司“更好的解决方案”,而这家公司在DB中还不存在,James现在搬到了这家公司

我该如何告诉EF处理这件事?目前我:

将新公司的“更好的解决方案”(使用GUID ID创建的对象)保存到数据库:

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我同意。我更愿意用存根实体来制定一个解决方案,但这需要更多的时间(我现在没有)。