如何在实体框架中处理多对多关系中的级联删除

时间:2018-11-28 17:58:05

标签: c# entity-framework entity-framework-6

我有三个实体:document.createElementappendChildBoss。老板有一套可以发出的指令(一对多关系),老板有一套可以发出这些指令的雇员(一对多关系)。指令可以给多个雇员使用,因此雇员与指令之间存在多对多的关系。所以这是我的实体:

Employee

目标是编写查询以获取老板的员工列表,并查看为每个指令分配了哪些员工。用这种方式进行建模的另一个原因是,我们可以强制执行唯一性约束,例如,使我们没有多次输入相同的Employee,也许我们不希望老板安排多名员工在同时。因此,这是带有通过Fluent API映射的那些关系的DbContext:

Instruction

public class Boss { public int ID { get; set; } public string Name { get; set; } public ICollection<Instruction> Instructions { get; set; } public ICollection<Employee> Employees { get; set; } } public class Employee { public int ID { get; set; } public int BossID { get; set; } public string Name { get; set; } public DateTime WorkTime { get; set; } public ICollection<Instruction> Instructions { get; set; } } public class Instruction { public int ID { get; set; } public string Name { get; set; } public int BossID { get; set;} public ICollection<Employee> Employees { get; set; } } 行在其中,因为否则会出现“多级联路径”错误。我想要的行为是,当我删除public class Model1 : DbContext { public Model1() : base("name=Model1") { } public virtual DbSet<Boss> Bosses { get; set; } public virtual DbSet<Instruction> Instructions { get; set; } public virtual DbSet<Employee> Employees { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); modelBuilder.Entity<Employee>().HasMany<Instruction>(x => x.Instructions).WithMany(x => x.Employees); modelBuilder.Entity<Boss>().HasMany<Instruction>(x => x.Instructions); modelBuilder.Entity<Boss>().HasMany<Employee>(x =>x.Employees); modelBuilder.Entity<Employee>().Property(x => x.BossID) .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("OneEmployeeAtATime", 0) { IsUnique = true })); modelBuilder.Entity<Employee>().Property(x => x.WorkTime) .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("OneEmployeeAtATime", 1) { IsUnique = true })); base.OnModelCreating(modelBuilder); } } 时,它也应该删除其modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();Boss,但是如果我删除EmployeesInstructions它不应该级联。但是当我运行测试时:

Instruction

我收到此错误消息:

  

System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误。有关详细信息,请参见内部异常。 ---> System.Data.Entity.Core.UpdateException:更新条目时发生错误。有关详细信息,请参见内部异常。 ---> System.Data.SqlClient.SqlException:DELETE语句与REFERENCE约束“ FK_dbo.EmployeeInstructions_dbo.Employees_Employee_ID”冲突。数据库“ Model1”的表“ dbo.EmployeeInstructions”的列“ Employee_ID”中发生了冲突。   该声明已终止。

我是否缺少Fluent API中的某些内容?

0 个答案:

没有答案