实体框架播种导致与外键插入语句冲突 [英] Entity Framework seeding causes insert statement conflict with foreign key

查看:102
本文介绍了实体框架播种导致与外键插入语句冲突的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的模型:

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

当我尝试种子我得到一个异常数据库,这是我如何播种:

when I try to seed the database I get an exception, this is how I'm seeding:

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();

我不断收到唯一的例外是:

The exception I keep getting is:

{INSERT语句冲突与外键约束\\FK_dbo.Task_dbo.Employee_EmployeeId \\。该冲突发生于数据库\\GIP \\,表\\dbo.Employee \\,列'雇员'。\\ r \\ n此语句已终止。}

{"The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_dbo.Task_dbo.Employee_EmployeeId\". The conflict occurred in database \"GIP\", table \"dbo.Employee\", column 'EmployeeId'.\r\nThe statement has been terminated."}

当我改变我的code以下内容,但是,我没有问题(播种同样的方式,但没有管理部分):

When I change my code to the following, however, I have no issues (seeding the same way, but no Manager portion):

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个外键约束,喜欢它感到困惑或东西...

it seems like when the Task class has 2 foreign key constraints its getting confused or something...

另外,如果我加入Manager类复出,但请从任务类的所有ForeignKey的限制,它没有任何问题,因为它创造了它在数据库的自动生成的外键列,一些员工外键是空的管理者的任务,并且经理外键被空员工任务

Also, if I add the Manager class back, but REMOVE ALL ForeignKey constraints from the Task class, it has no issues because it creates it's own auto-generated foreign key columns in the database, with some employee foreign keys being Null for manager tasks, and manager foreign keys being null for employee tasks

推荐答案

请确保您的FK列是空的,如。 INT?而不是 INT 。如果他们不为空,那么他们就默认为0,这将引用一个实体的0键,这将违反FK约束。

Make sure that your FK columns are nullable, eg. int? instead of int. If they are not null, then they are 0 by default, which will reference an entity with the 0 key, and that will violate the FK constraint.

这篇关于实体框架播种导致与外键插入语句冲突的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆