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

时间:2018-12-26 16:26:28

标签: entity-framework many-to-many entity-framework-core cascading-deletes

在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);
    }
}

0 个答案:

没有答案