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

时间:2019-01-21 02:25:22

标签: c# sql-server asp.net-core foreign-keys entity-framework-core

我正在使用SQL,并尝试使用Entity Framework Core进行添加迁移。我不确定如何解决此问题。它用于将审阅系统与用户和产品相关联。这在SQLite中有效。现在使用SQL Server。我已经尽量简短地提供所有信息。如果需要,我可以提供更多。以下是我的代码,有人可以帮忙吗?

  

在类“ Program”上访问IWebHost时发生错误。没有应用程序服务提供商就继续进行。错误:在表'ProductReviews'上引入FOREIGN KEY约束'FK_ProductReviews_AspNetUsers_ReviewerId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。   无法创建约束或索引。查看以前的错误。

我尝试了注释掉的代码。

            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; }
        // *****
    }

1 个答案:

答案 0 :(得分:1)

我刚刚尝试过:

create TEMPORARY table simotmp 
SELECT ost_ticket.ticket_id, 
ost_form_entry_values.field_id, ost_form_entry_values.value from ost_ticket
join ost_form_entry on ost_ticket.ticket_id=ost_form_entry.object_id
join ost_form_entry_values on ost_form_entry.id=ost_form_entry_values.entry_id
WHERE ost_ticket.`staff_id`=22 and ost_ticket.`status_id`=1 ;

SET @sql = NULL;
SELECT
  GROUP_CONCAT(
     'value AS '  + #field_id
      value field_id
  ) INTO @sql
from simotmp;

SET @sql = CONCAT('SELECT distinct pt.ticket_id, ', @sql, ' from simotmp pt
');
#group by pt.ticket_id');


PREPARE stmt FROM @sql;

select @sql;
EXECUTE stmt;

DEALLOCATE PREPARE stmt;

您没有提供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); } 类,所以我创建了这个类:

MemberReview

这是结果:

DB Diagram