c# - Entity Framework 播种导致插入语句与外键冲突

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

我不断遇到的异常是:

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

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

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 类中删除所有外键约束,它不会出现任何问题,因为它在数据库中创建自己的自动生成的外键列,并且某些员工外键为 Null经理任务,经理外键对于员工任务为空

最佳答案

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

关于c# - Entity Framework 播种导致插入语句与外键冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26822303/

相关文章:

ASP.NET MVC 通过 ActionLink 传递模型

asp.net-mvc - Entity Framework - 无法创建类型为 x 的常量值。在此上下文中仅支持原始类型。

c# - 将代码从 RestSharp 转换为 HttpClient

mysql - MySQL中无默认值Vs NULL Vs 0作为文本和整型字段的默认值

c# - 使用 Entity Framework Core 数据库优先方法,如何将实体与基础设施层分离?

php - 用 PHP 显示 MYSQL。想要将选定的行移动到另一个 sql 表并从现有表中删除

java - PHP 比较从 java 接收到的值

jquery - ASP.Net MVC Recaptcha Jquery Ajax 问题

c# - 与 Xamarin.Forms 一起使用的面向 NoSQL 文档的存储替代方案

c# - 在 c# 中将字符串转换为 xml 会出现空白错误