Ошибка SQL: введение ограничения FOREIGN KEY может привести к появлению циклов или нескольких каскадных путей.Entity Framework Core - PullRequest
0 голосов
/ 21 января 2019

Я использую SQL и пытаюсь добавить-миграцию с помощью Entity Framework Core. Я не уверен, как решить эту проблему. Это для связи системы обзора с пользователем и продуктом. Это работало в SQLite. Теперь с помощью сервера SQL. Я пытался предоставить все, будучи кратким. Я могу предоставить больше, если это необходимо. Ниже мой код, кто-нибудь может помочь?

Произошла ошибка при доступе к IWebHost в классе «Программа». Продолжая без поставщика услуг приложения. Ошибка: введение ограничения FOREIGN KEY «FK_ProductReviews_AspNetUsers_ReviewerId» в таблицу «ProductReviews» может привести к возникновению циклов или нескольких каскадных путей. Укажите 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 голосов
/ 21 января 2019

Я только что попробовал это:

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, поэтому я создал это:

public class MemberReview
{
    public User Reviewer { get; set; }
    public int ReviewerId { get; set; }

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

И вот результат:

DB Diagram

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...