簡體   English   中英

實體框架播種導致插入語句與外鍵沖突

[英]Entity Framework seeding causes insert statement conflict with foreign key

我有一個簡單的模型:

class Employee {
 int EmployeeId {get;set;}
 List<Task> Tasks {get;set;}
}

class Manager {
 int ManagerId {get;set;}
 List<Task> Tasks {get;set;}
}

class Task {
 int TaskId {get;set;}
 EmployeeId {get;set;}
 ManagerId {get;set;}

 [ForeignKey("EmployeeId")]
 Employee Employee {get;set;}

 [ForeignKey("ManagerId")]
 Manager Manager {get;set;}
}

class Task1 : Task { }
class Task2 : Task { }

當我嘗試播種數據庫時,出現異常,這就是播種方式:

Employee employee = new Employee();
context.Employees.Add(employee);
context.SaveChanges();

Manager manager = new Manager();
context.Managers.Add(manager);
context.SaveChanges();

List<Task> EmpTask = new List<Task>();
//EXCEPTION OCCURS HERE WHEN I TRY TO ADD NEW TASK ITEMS 
Task EmpOne = new Task1();
Task EmpTwo = new Task2();
EmpTask.Add(EmpOne);
EmpTask.Add(EmpTwo);

Employee.Tasks = EmpTask;
Context.Entry(employee).State = EntityState.Modified;
Context.SaveChanges();

List<Task> ManagerTask = new List<Task>();
Task ManagerOne = new Task1();
Task ManagerTwo = new Task2();
ManagerTask.Add(ManagerOne);
ManagerTask.Add(ManagerTwo);

Manager.Tasks = ManagerTask;
Context.Entry(manager).State = EntityState.Modified;
Context.SaveChanges();

我不斷得到的例外是:

{“ INSERT語句與FOREIGN KEY約束\\“ FK_dbo.Task_dbo.Employee_EmployeeId \\”沖突。沖突發生在數據庫\\“ GIP \\”,表\\“ dbo.Employee \\”,列'EmployeeId'中。\\ r \\ nThe語句已終止。“}

但是,當我將代碼更改為以下代碼時,我沒有任何問題(播種方式相同,但沒有Manager部分):

class Employee {
 int EmployeeId {get;set;}
 List<Task> Tasks {get;set;}
}
class Task {
 int TaskId {get;set;}
 int EmployeeId {get;set;}
 [ForeignKey("EmployeeId")]
 Employee Employee {get;set;}
}

似乎當Task類具有2個外鍵約束時,它會變得混亂或其他問題。

另外,如果我重新添加Manager類,但是從Task類中刪除了所有ForeignKey約束,則它沒有問題,因為它在數據庫中創建了自己的自動生成的外鍵列,而某些員工外鍵對於Manager任務而言為Null,和經理外鍵對於員工任務為空

確保您的FK列為空,例如。 int? 而不是int 如果它們不為null,則默認情況下為0,它將使用0鍵引用實體,這將違反FK約束。

如果要指定自己的外鍵,則屬性必須是虛擬的。

例:

[ForeignKey(“ Employee”)] public virtual int EmployeeId {get; 組; }

[ForeignKey(“ EmployeeId”)]公共虛擬Employee員工{get; 組; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM