因此,我正在将一个项目从 .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 中的脚手架数据库上带回联接表。显然没有直接的方法来映射连接表,但是可以使用解决方法(并在第二个链接中进行描述)。
归档时间: |
|
查看次数: |
1292 次 |
最近记录: |