因此,我正在将一个项目从 .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/