在Entity Framework Core中,我尝试创建一个具有4个Db模型的系统-图像,标签,图像标签,用户。 Image和Tag是多对多的关系,由ImageTag表提供。图像和标签还以多对一关系直接链接到用户(图像是用户的属性,因此是必需的关系),因此,删除用户时,它应该级联并删除属于该用户的所有图像,标签和图像标签用户。当我尝试实现此功能并使用下面的代码执行Update-Database时,出现以下错误:
在表'ImageTag'上引入FOREIGN KEY约束'FK_ImageTag_Tags_TagId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
经过多次尝试和错误,看来该问题的一种解决方案是使Image和Tag上的UserId可为空。这会将那些表上的外键约束中的ReferentialAction从ReferentialAction.Cascade更改为ReferentialAction.Restrict。但是...
1)我不完全确定为什么可以解决此问题,因为该错误涉及ImageTag约束,而不是User约束。
2)我不想使图像/标签和用户之间的关系成为可选/可空的。
3)但这确实得到了解决,理想情况下,仍将允许在适当的情况下级联删除。
public class Image
{
public long Id { get; set; }
public string FileExtension { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
public virtual ICollection<ImageTag> ImageTags { get; set; }
}
public class Tag
{
public long Id { get; set; }
public string Name { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
public virtual ICollection<ImageTag> ImageTags { get; set; }
}
public class ImageTag
{
public long ImageId { get; set; }
public long TagId { get; set; }
public virtual Image Image { get; set; }
public virtual Tag Tag { get; set; }
}
public class User
{
public int Id { get; set; }
public virtual ICollection<Image> Images { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
public class MyDbContext : DbContext
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ImageTag>()
.HasKey(x => new { x.ImageId, x.TagId });
modelBuilder.Entity<ImageTag>()
.HasOne(bc => bc.Image)
.WithMany(b => b.ImageTags)
.HasForeignKey(bc => bc.ImageId);
modelBuilder.Entity<ImageTag>()
.HasOne(bc => bc.Tag)
.WithMany(c => c.ImageTags)
.HasForeignKey(bc => bc.TagId);
}
}