Введение ограничения FOREIGN KEY - Основная миграция - PullRequest
0 голосов
/ 06 мая 2019

Я попытался сделать какой-нибудь проект на C # с ядром платформы 2.1. Однако есть проблема, которую я не могу решить, так как не вижу в этом ничего плохого. Я пытаюсь просто выполнить миграцию в моей базе данных.
Нет проблем, пока я не напишу «Update-Database» на консоли диспетчера пакетов После попытки обновить базу данных появляется сообщение об ошибке:

Введение ограничения FOREIGN KEY 'FK_Users_Baskets_BasketId' в таблице 'Users' может привести к возникновению циклов или нескольких каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, либо измените другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Смотрите предыдущие ошибки.

Basket.cs

public class Basket {
            [Key]
            public int BasketId { get; set; }

            public List<ProductByBasket> ProductByBaskets { get; set; }

            public string BasketName { get; set; }
            public int UserId { get; set; }
            [ForeignKey("UserId")]
            public User User { get; set; } 
      }

Product.cs

     public class Product {
            [Key]
            public int ProductId { get; set; }

            public List<ProductByBasket> ProductByBaskets { get; set; }

            public string ProductName { get; set; }
      }

ProductByBasket.cs

            [Key]
            public int ProductByBasketId { get; set; }

            public int BasketId { get; set; }
            [ForeignKey("BasketId")]
            public Basket Basket { get; set; }

            public int ProductId { get; set; }
            [ForeignKey("ProductId")]
            public Product Product { get; set; }

      }

Файл миграции

migrationBuilder.CreateTable(
               name: "ProductByBaskets",
               columns: table => new
               {
                   BasketId = table.Column<int>(nullable: false),
                   ProductId = table.Column<int>(nullable: false),
                   ProductByBasketId = table.Column<int>(nullable: false)
               },
               constraints: table =>
               {
                   table.PrimaryKey("PK_ProductByBaskets", x => new { x.ProductId, x.BasketId });
                   table.UniqueConstraint("AK_ProductByBaskets_ProductByBasketId", x => x.ProductByBasketId);
                   table.ForeignKey(
                       name: "FK_ProductByBaskets_Products_ProductId",
                       column: x => x.ProductId,
                       principalTable: "Products",
                       principalColumn: "ProductId",
                       onDelete: ReferentialAction.Cascade);
               });

ApplicationDbContext.cs

 public class ApplicationDbContext : DbContext {
            public ApplicationDbContext() { }

            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
                  string connectionString = @"Data Source=...\SQLEXPRESS; Initial Catalog = db; Integrated Security=true;";
                  optionsBuilder.UseSqlServer(connectionString);
                  base.OnConfiguring(optionsBuilder);
            }

            protected override void OnModelCreating(ModelBuilder modelBuilder) {

                  modelBuilder.Entity<ProductByBasket>()       
       .HasOne(u => u.Basket).WithMany(u => u.ProductByBaskets).IsRequired().OnDelete(DeleteBehavior.Restrict);

                  modelBuilder.Entity<ProductByBasket>()
                     .HasKey(x => new { x.ProductId, x.BasketId });

                  modelBuilder.Entity<ProductByBasket>()
                      .HasOne(pt => pt.Basket)
                      .WithMany(p => p.ProductByBaskets)
                      .HasForeignKey(pt => pt.BasketId); 

                  modelBuilder.Entity<ProductByBasket>()
                      .HasOne(pt => pt.Product)
                      .WithMany(t => t.ProductByBaskets)
                      .HasForeignKey(pt => pt.ProductId);
            }


            public DbSet<Product> Products { get; set; }
            public DbSet<Basket> Baskets { get; set; } 
            public DbSet<User> Users { get; set; } 
            public DbSet<ProductByBasket> ProductByBaskets { get; set; }

      }

Я попытался настроить файл миграции для записи. Тогда это выглядит так:

migrationBuilder.CreateTable(
                name: "ProductByBaskets",
                columns: table => new
                {
                    BasketId = table.Column<int>(nullable: false),
                    ProductId = table.Column<int>(nullable: false),
                    ProductByBasketId = table.Column<int>(nullable: false).Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
                },
                constraints: table =>
                {
                      table.PrimaryKey("PK_ProductByBaskets", x => x.ProductByBasketId);
                      table.ForeignKey(
                          name: "FK_ProductByBaskets_Baskets_BasketId",
                          column: x => x.BasketId,
                          principalTable: "Baskets",
                          principalColumn: "BasketId",
                          onDelete: ReferentialAction.Cascade);
                      table.PrimaryKey("PK_ProductByBaskets", x => new { x.ProductId, x.BasketId });
                    table.UniqueConstraint("AK_ProductByBaskets_ProductByBasketId", x => x.ProductByBasketId);
                    table.ForeignKey(
                        name: "FK_ProductByBaskets_Products_ProductId",
                        column: x => x.ProductId,
                        principalTable: "Products",
                        principalColumn: "ProductId",
                        onDelete: ReferentialAction.Cascade);
                });

Тогда я получаю эту ошибку:

Недопустимая таблица ссылок на внешние ключи.

Что я делаю не так?

...