实体框架种子导致插入语句与外键冲突

时间:2014-11-08 21:28:39

标签: c# mysql asp.net-mvc entity-framework asp.net-mvc-5

我有一个简单的模型:

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 \“,table \”dbo.Employee \“,列'EmployeeId'。 r \ n声明已经终止。“}

但是,当我将代码更改为以下内容时,我没有任何问题(播种方式相同,但没有经理部分):

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约束,则它没有问题,因为它在数据库中创建了自己的自动生成的外键列,其中一些员工外键为Null管理员任务,并且经理外键对于员工任务为空

2 个答案:

答案 0 :(得分:2)

确保您的FK列可以为空,例如。 int?代替int。如果它们不为null,则默认为0,这将引用具有0键的实体,这将违反FK约束。

答案 1 :(得分:0)

如果要指定自己的外键,则属性必须是虚拟的。

示例:

[ForeignKey的( “雇员”)] public virtual int EmployeeId {get;组; }

[ForeignKey的( “雇员”)] 公共虚拟员工员工{get;组; }