gpt4 book ai didi

c# - EF Core Fluent API 配置防止 TPC 继承

转载 作者:太空宇宙 更新时间:2023-11-03 22:47:35 26 4
gpt4 key购买 nike

我有相互继承的模型,但我正在努力让流畅的 api 配置按照我想要的方式运行。假设我有一个定义了一些核心属性的基类

public class Entity
{
public int Id { get; set; }
public string Title { get; set };
}

Book 的子类

public class Book : Entity
{
public int Edition { get; set; }
}

这样我就可以拥有书籍、杂志、小册子、漫画、演讲等,所有这些都继承 self 的实体,而不必在每个类上定义关系。

现在我像这样将我的 DbSet 添加到 DbContext

public class ApplicationDbContext : DbContext
{
public virtual DbSet<Book> Books { get; set; }
public virtual DbSet<Magazine> Magazines { get; set; }
public virtual DbSet<Comic> Comics { get; set; }
}

最后我添加迁移初始。

我的迁移现在为每种类型创建单独的表 (TPC)。完美。

当我尝试使用 Fluent API 配置我的基类时出现问题。

我为实体添加配置

class EntityConfiguration : IEntityTypeConfiguration<Entity>
{
public void Configure(EntityTypeBuilder<Entity> builder)
{
builder.HasKey(e => e.Id);
builder.Property(e => e.Title).IsRequired();
}
}

想法是我现在只需要配置基本实体,子类的所有表都应该采用配置。

我将我的配置添加到 DbContext OnModelCreating 方法。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfiguration(new EntityConfiguration());
}

当我添加迁移时,我会得到这个

migrationBuilder.CreateTable(
name: "Entity",
columns: table => new
{
Edition = table.Column<int>(nullable: true),
Name = table.Column<string>(nullable: true),
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
Discriminator = table.Column<string>(nullable: false),
Title = table.Column<string>(nullable: false),
Frequency = table.Column<int>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Entity", x => x.Id);
});

通过尝试配置基类,EF 现在沿着 TPH 路线走下去,并为带有鉴别器列的实体创建单个表。

有没有办法避免这种情况?甚至可以配置基类并让所有具体表都采用基类上的配置但为子类创建表吗?

注意:我曾尝试直接在 DbContext OnModelCreating 方法中配置实体,而不是使用单独的配置类,但这的行为是一样的。

EF Core 文档实际上说不支持 TPC,这很奇怪,因为它确实会为子类创建单独的表,直到我尝试配置基类。

我曾尝试使用 Ignore() 来抑制 TPH,但这没有效果。

给出的例子不是真实世界。我的实际项目有更多的类,它们都有共同的属性和关系,所以我想避免一遍又一遍地配置相同的东西。

最佳答案

您说 EF Core 在编写时不支持 TPC 是正确的。

但是,似乎确实有一种方法可以解决这个问题(至少可以生成“Up”脚本)。

删除 FluentAPI 注册并在 Entity 类的属性上使用 Annotations:

public abstract class Entity
{
[Key]
public int Id { get; set; }
[Required]
public string Title { get; set; }
}

此外,因为 TPC 是每个(具体)类的表,所以最好使您从抽象继承的类。

关于c# - EF Core Fluent API 配置防止 TPC 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49175564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com