用户,雇主,候选人和职位,雇主可以创建多个职位,每个职位只能有一个雇主,候选人可以申请多个职位,每个职位可以有多个应用成员。
所以这种关系是这样的:
我使用的是实体框架代码优先方法,目前,如果我删除一个雇主,它将从数据库中删除所有相关的工作和用户,如果我删除了候选人,它将要删除该用户:
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,但是当我删除已申请职位的候选人或尝试删除已申请职位的候选人时,这给了我错误。
如何解决这个错误?以便:
我已经解决了这个问题
发生问题是因为我有两个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] 删除。
我来说两句