如果您錯誤地使用分離的實體,這是EF如何工作的方式。我想你使用的是這樣的:
var employee = new Employee();
employee.Department = GetDepartmentFromSomewhere(departmentId);
...
using (var context = new YourContext())
{
context.Employees.AddObject(employee);
context.SaveChanges();
}
此代碼準備員工實體,增加了對現有部門的參考,並將新員工保存到數據庫。哪裏有問題?問題是,AddObject
不會只添加員工,而是添加整個對象圖。這就是EF的工作原理 - 你不能有對象圖,其中部分對象連接到上下文,而不是部分對象。 AddObject
將圖形中的每個對象都添加爲一個新對象(新建一個=在數據庫中插入)。因此,您必須更改操作順序或手動修改實體狀態,以便您的上下文知道該部門已存在。
首先解決方案 - 用於裝載部門同樣的情況下,節省員工:
using (var context = new YourContext())
{
var employee = new Employee();
...
context.Employees.AddObject(employee);
employee.Department = context.Departments.Single(d => d.Id == departmentId);
context.SaveChanges();
}
二的解決方案 - 實體單獨連接上下文後,使實體之間的參考:
var employee = new Employee();
...
var department = GetDepartmentFromSomewhere(departmentId);
using (var context = new YourContext())
{
context.Employees.AddObject(employee);
context.Departments.Attach(department);
employee.Department = department;
context.SaveChanges();
}
三解決方案 - 手動修正部門的狀態,以便上下文不會再次插入:
var employee = new Employee();
employee.Department = GetDepartmentFromSomewhere(departmentId);
...
using (var context = new YourContext())
{
context.Employees.AddObject(employee);
context.ObjectStateManager.ChangeObjectState(employee.Department,
EntityState.Unchanged);
context.SaveChanges();
}
什麼主鍵異常?這可能是因爲您沒有將模型的主鍵屬性StoreGeneratedPattern設置爲Identity。如果這不是這種情況,請您提供一些代碼示例來查看? – philt5252