用于从 3.1 迁移的 .NET Core 6 脚手架省略了多对多桥接表

N.M*_*ORR 2 c# .net-core

因此,我正在将一个项目从 .NET Core 3.1 迁移到 .NET Core 6,并希望搭建一个新的上下文类。这是我的数据库的 SQL:

CREATE TABLE Product 
(
    Product_ID int NOT NULL 
        CONSTRAINT PK_Products PRIMARY KEY CLUSTERED,
    Description varchar(100) NOT NULL 
        CONSTRAINT UC_Product UNIQUE,
);

CREATE TABLE ProductCategory 
(
    ProductCategory_ID int NOT NULL 
        CONSTRAINT PK_ProductCategory PRIMARY KEY CLUSTERED,
    Description varchar(100) NOT NULL 
        CONSTRAINT UC_ProductCategory UNIQUE,
);

CREATE TABLE Product_ProductCategory 
(
    Product_ID int NOT NULL 
        CONSTRAINT FK_ProductProductCategory_Products REFERENCES Product(Product_ID),
    ProductCategory_ID int NOT NULL 
        CONSTRAINT FK_ProductProductCategory_ProductCategory REFERENCES ProductCategory(ProductCategory_ID),
    CONSTRAINT PK_ProductProductCategory 
       PRIMARY KEY CLUSTERED (Product_ID, ProductCategory_ID)
);
Run Code Online (Sandbox Code Playgroud)

这是用于脚手架的脚本:

Scaffold-DbContext "Server=.;Database=MyDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer 
    -OutputDir Models -DataAnnotations 
    -Tables Product, ProductCategory, Product_ProductCategory
Run Code Online (Sandbox Code Playgroud)

使用ProductProductCategory代替Product_ProductCategory具有相同的结果。

这是我的上下文类中的结果代码:

namespace MyProject.Models
{
    public partial class ProjectContext : DbContext
    {
        public ProjectContext()
        {
        }

        public ProjectContext(DbContextOptions<ProjectContext> options)
            : base(options)
        {
        }

        //why are there only 2 tables here?
        public virtual DbSet<Product> Products { get; set; }
        public virtual DbSet<ProductCategory> ProductCategories { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>(entity =>
            {
                entity.Property(e => e.ProductId).ValueGeneratedNever();

                entity.HasMany(d => d.ProductCategories)
                    .WithMany(p => p.Products)
                    .UsingEntity<Dictionary<string, object>>(
                        "ProductProductCategory",
                        l => l.HasOne<ProductCategory>().WithMany().HasForeignKey("ProductCategoryId").HasConstraintName("FK_ProductProductCategory_ProductCategory"),
                        r => r.HasOne<Product>().WithMany().HasForeignKey("ProductId").OnDelete(DeleteBehavior.ClientSetNull).HasConstraintName("FK_ProductProductCategory_Products"),
                        j =>
                        {
                            j.HasKey("ProductId", "ProductCategoryId").HasName("PK_ProductProductCategory");

                            j.ToTable("Product_ProductCategory");

                            j.IndexerProperty<int>("ProductId").HasColumnName("Product_ID");

                            j.IndexerProperty<int>("ProductCategoryId").HasColumnName("ProductCategory_ID");
                        });
            });

            modelBuilder.Entity<ProductCategory>(entity =>
            {
                entity.Property(e => e.ProductCategoryId).ValueGeneratedNever();
            });

            OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }
}
Run Code Online (Sandbox Code Playgroud)

桥接表根本就丢失了。在我的 Core 3.1 项目代码中,桥接表被频繁引用,它们的缺失导致了很多关于我的上下文类中缺少定义的错误。它也无法生成实体类。

Core 6 完全忽略这些表有什么原因吗?该代码确实承认桥接表,但如果没有实际的定义,则无法使用它。

请注意,我的完整代码有超过 20 个这样的桥接表。手动添加它们并不是一项简单的任务。原始实体也在 .NET Core 3.1 中搭建。

此外,表格现在已多元化。有没有办法让它们保持单一?(.NET Core 3.1 Scaffold 很单一,导致了更多问题)

但最重要的是,如何获得丢失的桥接表?

小智 5

问题#22475 在逆向工程中检测简单联接表并创建多对多关系,并为此打开了#26820 可选地在 EF Core 6 中的脚手架数据库上带回联接表。显然没有直接的方法来映射连接表,但是可以使用解决方法(并在第二个链接中进行描述)。