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

标签 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)
);

这是用于搭建脚手架的脚本:

Scaffold-DbContext "Server=.;Database=MyDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer 
    -OutputDir Models -DataAnnotations 
    -Tables Product, ProductCategory, Product_ProductCategory

使用 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);
    }
}

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

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

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

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

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

最佳答案

问题#22475 Detect simple join tables in reverse engineering and create many-to-many relationships#26820 Optionally bring back join tables on scaffold db in EF Core 6为此而开放。显然没有直接的方法来映射连接表,但可以使用解决方法(并在第二个链接中进行描述)。

关于c# - 用于从 3.1 迁移的 .NET Core 6 脚手架省略了多对多桥接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70677783/

相关文章:

c# - 通过 MVC3 提供音频文件的问题 |使用各种 HTML5 播放器

c# - ServiceStack Redis获取结构始终返回默认值

c# - 树遍历 API 的访问者模式与 LINQ 风格的流畅语法

c# - 在 Windows 8 中隐藏任务栏

c# - Apache Ignite.NET LINQ 失败

c# - 在 Entity Framework 核心中执行存储过程而不期望映射到 dbset

asp.net-core - 为 active 探针 openshift 为非 api 项目创建 HealthCheck

sql-server - Entity Framework 核心-错误: keyword not supported: '"server'

c# - WCF/客户端应用程序——业务逻辑应该放在哪里?

c# - 如何在 C# 中获取内存 MS Windows 7 的当前页面大小?