引入FOREIGN KEY约束可能会导致循环或多个级联路径。指定删除时不执行任何操作

无心

用户,雇主,候选人和职位,雇主可以创建多个职位,每个职位只能有一个雇主,候选人可以申请多个职位,每个职位可以有多个应用成员。

所以这种关系是这样的:

在此处输入图片说明

我使用的是实体框架代码优先方法,目前,如果我删除一个雇主,它将从数据库中删除所有相关的工作和用户,如果我删除了候选人,它将要删除该用户:

modelBuilder.Entity<Employer>()
     .HasRequired(e => e.User)
    .WithOptional(e => e.Employer).WillCascadeOnDelete();

//member is candidate
modelBuilder.Entity<Member>()
    .HasRequired(e => e.User)
    .WithOptional(e => e.Member).WillCascadeOnDelete();

modelBuilder.Entity<Employer>()
    .HasMany(a => a.Jobs)
    .WithRequired(b => b.Employer)
    .WillCascadeOnDelete();

一切工作正常,除非我指定候选人与工作之间的多对多关系并使用“ update-database”更新数据库,否则会出现以下错误:

在表“ MemberJobMap”上引入FOREIGN KEY约束“ FK_dbo.MemberJobMap_dbo.Jobs_JobId”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。无法创建约束。请参阅先前的错误。

这是我指定多对多关系的方式:

modelBuilder.Entity<Member>()
   .HasMany(m => m.Jobs)
   .WithMany(j => j.Members)
   .Map(c =>
   {
      c.MapLeftKey("Id");
      c.MapRightKey("JobId");
      c.ToTable("MemberJobMap");
   });

当我添加迁移时:

CreateTable(
   "dbo.MemberJobMap",
   c => new
   {
      Id = c.String(nullable: false, maxLength: 128),
      JobId = c.Int(nullable: false),
   })
   .PrimaryKey(t => new { t.Id, t.JobId })
   .ForeignKey("dbo.Members", t => t.Id, cascadeDelete: true)
   .ForeignKey("dbo.Jobs", t => t.JobId, cascadeDelete: true)
   .Index(t => t.Id)
   .Index(t => t.JobId);   

我尝试将cascadeDelete更改为false,但是当我删除已申请职位的候选人或尝试删除已申请职位的候选人时,这给了我错误。

如何解决这个错误?以便:

  1. 删除作业后,它将删除关联的候选人作业图表行,而不会影响任何其他表
  2. 删除候选人时,它将删除关联的候选人工作表表行和用户表行,而不会影响任何其他表
  3. 同时保持所有其他指定的级联删除操作相同
无心

我已经解决了这个问题

发生问题是因为我有两个CandidateJobMap表的级联删除路径:

如果我删除了雇主,它将删除相关的雇主工作,这将依次删除CandidateJobMap表:

雇主->职位->候选人职位地图

如果删除候选者,它将删除CandidateJobMap表:

成员->候选人职位地图

因此,要解决此问题,我必须禁用删除路径之一,在创建多对多关系时不能指定WillCascadeDelete(false),因此必须按以下方式更改迁移:

CreateTable(
   "dbo.MemberJobMap",
   c => new
   {
      Id = c.String(nullable: false, maxLength: 128),
      JobId = c.Int(nullable: false),
   })
   .PrimaryKey(t => new { t.Id, t.JobId })
   .ForeignKey("dbo.Members", t => t.Id, cascadeDelete: false) <--------cascade delete to false
   .ForeignKey("dbo.Jobs", t => t.JobId, cascadeDelete: true)
   .Index(t => t.Id)
   .Index(t => t.JobId);   

现在,因为您将层叠删除设置为false,所以当删除候选者时,它不会删除相关的CandidateJobMap行,当您尝试删除与CandidateJobMap也是相关关键字的候选者时,这将导致另一个错误。在删除候选者之前手动删除CandidateJobMap中的相关行:

//remove all applied jobs from user, without doing this, you will receive an error
foreach (var appliedjob in user.Member.Jobs.ToList())
{
    user.Member.Jobs.Remove(appliedjob);
}

//before you can delete the user
await UserManager.DeleteAsync(user);

不知道这是否是最好的方法,但是对我有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在表 'Y' 上引入 FOREIGN KEY 约束 'X' 可能会导致循环或多个级联路径

引入FOREIGN KEY约束可能会导致循环或多个级联路径

引入FOREIGN KEY约束可能会导致循环或多个级联路径-为什么?

SQL Server 引入 FOREIGN KEY 约束可能会导致循环或多个级联路径

ef core 2 - 在表“Y”上引入 FOREIGN KEY 约束“X”可能会导致循环或多个级联路径

如何防止错误:在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径

Entity Framework Core 5 - 在表上引入 FOREIGN KEY 约束可能会导致循环或多个级联路径

SQL错误:引入FOREIGN KEY约束可能会导致循环或多个级联路径。实体框架核心

在表 'ReservedSeats' 上引入 FOREIGN KEY 约束 'FK_ReservedSeats_Seats_SeatId' 可能会导致循环或多个级联路径

在表上引入FOREIGN KEY约束可能会导致循环或多个级联路径,即使在完全删除受影响的字段之后也是如此

可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束

在表“ Employer”上引入FOREIGN KEY约束“ FK__Employer__postal__59FA5E80”可能会导致循环或多个级联路径

由于级联删除而导致的“ FOREIGN KEY约束引入”

FOREIGN KEY可能会导致循环或多个级联路径异常

实体框架核心:如何解决?引入外键约束可能会导致循环或多个级联路径

无法执行DbCommand引入的FOREIGN KEY约束

引入FOREIGN KEY约束-数据库设置

具有相同必需属性类型的EF Core TPH实体导致“引入FOREIGN KEY约束”异常

FK约束可能会导致循环或多个级联路径

实体框架-引入外键约束可能会导致周期

外键约束可能会导致循环或多个级联路径?

SQL可能会导致循环或多个级联路径

实体框架级联删除-FOREIGN KEY约束

外键约束可能会导致循环或多个级联路径,但只能在一个项目中

EF Core DeleteBehavior.Cascade可能会导致循环或多个级联路径

是否引入一个中间列表可能会导致性能开销?

SQLite删除级联不起作用:FOREIGN KEY约束失败

实体框架代码的第一个外键可能会导致循环或多个级联路径

循环中引入验证步骤