EF Core,配置modelBuilder来修复错误"循环或多个级联路径"

时间:2017-07-16 12:21:31

标签: entity-framework asp.net-core entity-framework-core

我想配置以下关系:

  • Like可能有一个Reason(类型注释),如果Like将被删除,则此注释必须被级联删除
  • 喜欢可能有评论(类型评论)或用户(类型用户),如果评论或用户将被删除,则必须删除级联
  • 喜欢不能同时拥有Comment(类型注释)和User(类型用户)
  • 作者(类型用户)必须无法创建Likes duplicates

我尝试了很多组合,但没有成功,请帮助我。

我目前的代码:

public class Comment
{
    public int Id { get; set; }
    public string Text { get; set; }
    public Like ToLike { get; set; }
    public int? ToLikeId { get; set; }
    public ICollection<Like> Likes { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public ICollection<Like> CreatedLikes { get; set; }
    public ICollection<Like> Likes { get; set; }
}

public class Like
{
    public int Id { get; set; }

    public User Author { get; set; }
    public int AuthorId { get; set; }

    public DateTime CreatedAt { get; set; }

    public Comment Reason { get; set; }

    public Comment Comment { get; set; }
    public int? CommentId { get; set; }

    public User User { get; set; }
    public int? UserId { get; set; }
}

        modelBuilder.Entity<Like>(b =>
        {
            b.HasAlternateKey(l => new { l.AuthorId, l.CommentId, l.UserId });
            b.HasOne(l => l.Reason)
            .WithOne(c => c.ToLike)
            .HasForeignKey<Comment>(c => c.ToLikeId)
            .OnDelete(DeleteBehavior.SetNull);

            b.HasOne(l => l.Author).WithMany(a => a.CreatedLikes)
                .OnDelete(DeleteBehavior.Restrict);

            b.HasOne(l => l.User).WithMany(u => u.Likes);
            b.HasOne(l => l.Comment)
            .WithMany(c => c.Likes)
            .HasForeignKey(c => c.CommentId);
        });

目前我在第一次数据库初始化时遇到此错误(行context.Database.Migrate();):

  

System.Data.SqlClient.SqlException:&#39;介绍FOREIGN KEY   约束&#39; FK_Likes_Comments_CommentId&#39;在桌子上&#39;喜欢&#39;可能会导致   循环或多个级联路径。指定ON DELETE NO ACTION或ON   更新NO ACTION,或修改其他FOREIGN KEY约束。

主要问题:如何修复此错误?

其他问题:

  • 如何配置我在顶部描述的所有需求?
  • Likes能够拥有用户活动历史记录的最佳数据库模式是什么?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了该问题,则在创建具有级联更新和删除的主键和外键关系时,您将遇到菱形图案。在具有级联关系的模式中,数据库发现级联不明确。

Sql Table Diamond

钻石中的一个关系必须具有外键的Restrict属性。

Microsoft Documentation on Entity Framework Core Relationships

  

级联删除

     

按照惯例,级联删除将设置为Cascade for required   关系和限制可选关系(参见   必需部分,用于必需和可选之间的差异   关系)。级联意味着也会删除依赖实体。   限制意味着未加载到内存中的从属实体   将保持不变,必须手动删除或更新为   指向有效的主体实体。对于加载到的实体   在内存中,EF将尝试将外键属性设置为null。