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

C# SQL错误:引入外键约束可能导致循环或多个级联路径。实体框架核心,c#,sql-server,asp.net-core,foreign-keys,entity-framework-core,C#,Sql Server,Asp.net Core,Foreign Keys,Entity Framework Core,我正在使用SQL并尝试使用实体框架核心添加迁移。我不确定如何解决这个问题。它用于将审查系统与用户和产品相关联。这在SQLite中起作用。现在使用SQL server。我尽量在简短的同时提供一切。如果需要,我可以提供更多。下面是我的代码,有人能帮忙吗 访问类“Program”上的IWebHost时出错。在没有应用程序服务提供商的情况下继续。错误:在表“ProductReviews”上引入外键约束“FK\u ProductReviews\u AspNetUsers\u ReviewerId”可能会导

我正在使用SQL并尝试使用实体框架核心添加迁移。我不确定如何解决这个问题。它用于将审查系统与用户和产品相关联。这在SQLite中起作用。现在使用SQL server。我尽量在简短的同时提供一切。如果需要,我可以提供更多。下面是我的代码,有人能帮忙吗

访问类“Program”上的IWebHost时出错。在没有应用程序服务提供商的情况下继续。错误:在表“ProductReviews”上引入外键约束“FK\u ProductReviews\u AspNetUsers\u ReviewerId”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。 无法创建约束或索引。请参阅前面的错误

我已经尝试了注释掉的代码

            protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

    builder.Entity<MemberReview>()
                .HasKey(k => new { k.RevieweeId, k.ReviewerId });

            builder.Entity<MemberReview>().
                HasOne(u => u.Reviewer)
                .WithMany(u => u.ReviewedMembers);
                // .HasForeignKey(u => u.ReviewerId)
                // .OnDelete(DeleteBehavior.Restrict);

            builder.Entity<MemberReview>().
                HasOne(u => u.Reviewee)
                .WithMany(u => u.MemberReviews);
            // .HasForeignKey(u => u.RevieweeId)
            // .OnDelete(DeleteBehavior.Restrict);

            builder.Entity<ProductReview>()
                .HasKey(k => new { k.ReviewerId, k.ReviewedProductId });

            builder.Entity<ProductReview>().
                HasOne(u => u.ReviewedProduct)
                .WithMany(u => u.ProductReviews);
                //.HasForeignKey(u => u.ReviewedProductId)
                //.OnDelete(DeleteBehavior.Restrict);

            builder.Entity<ProductReview>().
                HasOne(u => u.Reviewer)
                .WithMany(u => u.ReviewedProducts);
                //.HasForeignKey(u => u.ReviewerId)
                //.OnDelete(DeleteBehavior.Restrict);
        }

        public class ProductReview
    {
        public Product ReviewedProduct { get; set; }
        public User Reviewer { get; set; }
        [Required]
        public int ReviewerId { get; set; }
        [Required]
        [MaxLength(30)]
        public string ReviewerUserName { get; set; }
        [Required]
        public int ReviewedProductId { get; set; }
        [Required]
        [MaxLength(35)]
        public string Title { get; set; }
        [Required]
        [MaxLength(420)]
        public string Review { get; set; }
        [Required]
        [MaxLength(2)]
        public int Rating { get; set; }
    }

        public class User : IdentityUser<int>
    {
        [Required]
        [MaxLength(12)]
        public string UserType { get; set; }
        [Required]
        public DateTime DateOfEstablishment { get; set; }
        [Required]
        [MaxLength(75)]
        public string KnownAs { get; set; }
        public DateTime Created { get; set; }
        public DateTime LastActive { get; set; }
        [MaxLength(420)]
        public string Description { get; set; }
        public ICollection<Photo> Photos { get; set; }
        public ICollection<Product> Products { get; set; }
        // REVIEW THING
        public ICollection<MemberReview> MemberReviews { get; set; }
        public ICollection<MemberReview> ReviewedMembers { get; set; }
        public ICollection<ProductReview> ReviewedProducts { get; set; }
        // *****
    }

        public class Product
    {
        public int Id { get; set; }
        [Required]
        [MaxLength(75)]
        public string Name { get; set; }
        [Required]
        [MaxLength(420)]
        public string Description { get; set; }
        public DateTime DateAdded { get; set; }
        public User User { get; set; }
        [Required]
        public int UserId { get; set; }
        // REVIEW THINGS
        public ICollection<ProductReview> ProductReviews { get; set; }
        // *****
    }
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.Entity()
.HasKey(k=>new{k.reviewereid,k.ReviewerId});
builder.Entity()。
HasOne(u=>u.Reviewer)
.有许多成员(u=>u.ReviewedMembers);
//.HasForeignKey(u=>u.ID)
//.OnDelete(DeleteBehavior.Restrict);
builder.Entity()。
哈松(u=>u.Reviewee)
.有许多(u=>u.MemberReviews);
//.HasForeignKey(u=>u.ReviewEID)
//.OnDelete(DeleteBehavior.Restrict);
builder.Entity()
.HasKey(k=>new{k.ReviewerId,k.revieweredproductid});
builder.Entity()。
HasOne(u=>u.ReviewedProduct)
.有许多(u=>u.ProductReviews);
//.HasForeignKey(u=>u.ReviewedProductId)
//.OnDelete(DeleteBehavior.Restrict);
builder.Entity()。
HasOne(u=>u.Reviewer)
.有许多(u=>u.审查产品);
//.HasForeignKey(u=>u.ID)
//.OnDelete(DeleteBehavior.Restrict);
}
公共类产品评论
{
公共产品审查产品{get;set;}
公共用户审阅者{get;set;}
[必需]
public int ReviewerId{get;set;}
[必需]
[MaxLength(30)]
公共字符串审阅者用户名{get;set;}
[必需]
public int ReviewedProductId{get;set;}
[必需]
[MaxLength(35)]
公共字符串标题{get;set;}
[必需]
[MaxLength(420)]
公共字符串审阅{get;set;}
[必需]
[MaxLength(2)]
公共整数评级{get;set;}
}
公共类用户:IdentityUser
{
[必需]
[MaxLength(12)]
公共字符串用户类型{get;set;}
[必需]
公共日期时间建立日期{get;set;}
[必需]
[MaxLength(75)]
公共字符串KnownAs{get;set;}
已创建公共日期时间{get;set;}
public DateTime LastActive{get;set;}
[MaxLength(420)]
公共字符串说明{get;set;}
公共i收集照片{get;set;}
公共ICollection产品{get;set;}
//复习东西
公共ICollection MemberReviews{get;set;}
公共ICollection ReviewedMembers{get;set;}
公共ICollection ReviewedProducts{get;set;}
// *****
}
公共类产品
{
公共int Id{get;set;}
[必需]
[MaxLength(75)]
公共字符串名称{get;set;}
[必需]
[MaxLength(420)]
公共字符串说明{get;set;}
public DateTime DateAdded{get;set;}
公共用户{get;set;}
[必需]
public int UserId{get;set;}
//复习
公共ICollection ProductReviews{get;set;}
// *****
}
我刚试过这个:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<MemberReview>()
        .HasKey(e => new { e.RevieweeId, e.ReviewerId });

    builder.Entity<ProductReview>()
        .HasKey(e => new { e.ReviewerId, e.ReviewedProductId });

    builder.Entity<MemberReview>()
        .HasOne<User>(e => e.Reviewer)
        .WithMany(e => e.MemberReviews)
        .HasForeignKey(e => e.ReviewerId)
        .OnDelete(DeleteBehavior.Restrict); ////////
                                                  //
    builder.Entity<MemberReview>()                //
        .HasOne<User>(e => e.Reviewee)            /// => only one of these two can be cascade
        .WithMany(e => e.ReviewedMembers)         //
        .HasForeignKey(e => e.RevieweeId)         //
        .OnDelete(DeleteBehavior.Restrict); ////////

    builder.Entity<ProductReview>()
        .HasOne<User>(e => e.Reviewer)
        .WithMany(e => e.ReviewedProducts)
        .HasForeignKey(e => e.ReviewerId)
        .OnDelete(DeleteBehavior.Restrict);
}
这就是结果:


您试图在具有级联的表上使用多个外键,但SQL server不允许多个级联操作。如果您想在所有外键上使用类似级联的功能,您需要禁用外键上的级联选项并使用触发器来实现。非常感谢!这成功了!我改变的一件事是交换MemberReview上的FK。ReviewerId在.HasForeignKey上变为ReviewEID,反之亦然。。。
public class MemberReview
{
    public User Reviewer { get; set; }
    public int ReviewerId { get; set; }

    public User Reviewee { get; set; }
    public int RevieweeId { get; set; }
}