C# 实体框架种子设定导致insert语句与外键冲突

C# 实体框架种子设定导致insert语句与外键冲突,c#,mysql,asp.net-mvc,entity-framework,asp.net-mvc-5,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;se

我有一个简单的模型:

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 { }
class员工{
int EmployeeId{get;set;}
列出任务{get;set;}
}
班级经理{
int ManagerId{get;set;}
列出任务{get;set;}
}
课堂任务{
int TaskId{get;set;}
EmployeeId{get;set;}
ManagerId{get;set;}
[外籍钥匙(“员工ID”)]
雇员雇员{get;set;}
[外键(“ManagerId”)]
管理器{get;set;}
}
类Task1:任务{}
类Task2:任务{}
当我尝试对数据库进行种子设定时,我得到一个异常,我是这样进行种子设定的:

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();
Employee=新员工();
context.Employees.Add(雇员);
SaveChanges();
经理=新经理();
context.Managers.Add(manager);
SaveChanges();
List EmpTask=新列表();
//当我尝试添加新任务项时,此处发生异常
Task EmpOne=new Task1();
Task EmpTwo=new Task2();
EmpTask.Add(EmpOne);
EmpTask.Add(EmpTwo);
Employee.Tasks=EmpTask;
Context.Entry(employee.State=EntityState.Modified;
SaveChanges();
列表管理器任务=新建列表();
taskmanagerone=newtask1();
任务管理器wo=新任务2();
ManagerTask.Add(ManagerOne);
ManagerTask.Add(ManagerTwo);
Manager.Tasks=ManagerTask;
Context.Entry(manager.State=EntityState.Modified;
SaveChanges();
我一直得到的例外是:

{“INSERT语句与外键约束“FK_dbo.Task_dbo.Employee_EmployeeId”冲突。冲突发生在数据库“GIP\”表“dbo.Employee\”列“EmployeeId”中。\r\n该语句已终止。”

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

class员工{
int EmployeeId{get;set;}
列出任务{get;set;}
}
课堂任务{
int TaskId{get;set;}
int EmployeeId{get;set;}
[外籍钥匙(“员工ID”)]
雇员雇员{get;set;}
}
似乎当任务类有两个外键约束时,它会变得混乱或其他什么


另外,如果我重新添加Manager类,但从Task类中删除所有ForeignKey约束,则不会出现问题,因为它会在数据库中创建自己的自动生成外键列,并且对于Manager任务,某些employee外键为空,员工任务的manager外键为空

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

例如:

[外籍钥匙(“员工”)] 公共虚拟int EmployeeId{get;set;}

[外籍钥匙(“员工ID”)]
公共虚拟雇员雇员{get;set;}

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

这是您的实际代码吗?部分代码,其他部分(其他模型/实体/类)稍长,但这是相关部分,我将更新我的问题,添加一条信息,这可能会提供更多的上下文。您似乎忽略了EmployeeId和ManagerId的类型。它们是ints吗?尝试Nullable。不完全确定您的问题,但我注意到一些事情。当您首先编写代码时,通常不会放置外键列。您的任务具有employee和manager类的属性,这就是EF在db中构建正确密钥所需的全部内容。此外,在添加数据时,不需要每次插入内容时调用save changes。这与使用SQL向数据库中添加数据不同。创建所有EF对象关系,并在最后调用save changes一次。@Kirby我明白了,谢谢你的澄清,不过我有一个问题。如果我需要访问数据库中的外键,会发生什么?我自己放置外键列的原因是因为我有一个post方法,我需要将任务对象插入到正确的员工或经理中,但是员工和经理实际上是我整个项目中另一个类中的列表,所以我可以有多个员工和多个经理。我将尝试这个方法,我想我以前做过,但没有工作,再试试
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;}
}