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;}
}