引入FOREIGN KEY约束-基本迁移

时间:2019-05-06 14:35:53

标签: entity-framework-core entity-framework-core-migrations

我尝试使用C#和实体框架核心2.1进行一些项目。但是,有一个我无法解决的问题,因为我看不到任何错误。 我正在尝试在数据库中进行简单的迁移。
在我将“更新数据库”写入程序包管理器控制台之前,没有任何问题。尝试更新数据库后,这是错误消息:

在表“用户”上引入FOREIGN KEY约束'FK_Users_Baskets_BasketId'可能会导致循环或多个级联路径。指定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);
                });

然后我收到此错误:

外键引用无效表。

我在做什么错?

0 个答案:

没有答案