gpt4 book ai didi

c# - 使用 TPH 的 Entity Framework 的多级继承

转载 作者:行者123 更新时间:2023-11-30 14:52:16 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 在现有遗留数据库上的新项目中创建一个 Table Per Heirachy 数据模型。这意味着我们不拥有数据库,因此我需要一个不涉及向 OrderDiscount 表添加列的解决方案。

我的数据模型中有以下结构:

       ┌────── (abstract) OrderDiscountBase ──────┐
│ │
│ │
SaleOrderDiscount ┌─── (abstract) SellerOrderDiscountBase ───┐
│ │
│ │
FreeShippingOrderDiscount PercentageValueOrderDiscount

有一个预先存在的鉴别器列来区分具体类型。它称为 DiscountType,可以包含值 PercentageOffPromoDiscountFreeShippingPromoDiscountSaleDiscount

我的项目中有以下映射,不幸的是,它不起作用。

private void ConfigureOrderDiscountEntity(EntityTypeConfiguration<OrderDiscountBase> entity)
{
entity
.HasKey(orderDiscount => orderDiscount.Id)
.Map<SaleOrderDiscount>(
configuration => configuration.Requires("DiscountType").HasValue(OrderDiscountTypes.Sale))
.Map<PercentageValueOrderDiscount>(
configuration => configuration.Requires("DiscountType").HasValue(OrderDiscountTypes.PercentageOff))
.Map<FreeShippingOrderDiscount>(
configuration => configuration.Requires("DiscountType").HasValue(OrderDiscountTypes.FreeShipping))
.ToTable(tableName: "OrderDiscount", schemaName: "Orders")
;
}

我看到的异常是:

EntityTypes SellerOrderDiscountBase、SaleOrderDiscount、FreeShippingOrderDiscount、PercentageValueOrderDiscount 被映射到表 OrderDiscountBase 中的相同行。映射条件可以用来区分这些类型映射到的行。

我见过人们通过添加第二个鉴别器列来解决旧版本 Entity Framework 中的这个问题,但正如我所说,我无法对数据库进行更改。

我要求 EF 做的事情听起来并不难,所以我假设我只是错误地配置了我的实体。

最佳答案

在 EF 6.x 中绝对适合我:

public abstract class TPHBase
{
public int ID { get; set; }

public string CommonProperty { get; set; }
}

public class TPHChild1 : TPHBase
{
public string Child1Property { get; set; }
}

public abstract class TPHChild2 : TPHBase
{
public int? Child2Property { get; set; }
}

public class TPHChild3 : TPHChild2
{
public int? Child3Property { get; set; }
}

public class TPHChild4 : TPHChild2
{
public int? Child4Property { get; set; }
}

protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Entity<TPHBase>()
.ToTable( "TPHBase" )
.Map<TPHChild1>( m => m.Requires( "Dyskryminator" ).HasValue( "c1" ) )
.Map<TPHChild3>( m => m.Requires( "Dyskryminator" ).HasValue( "c3" ) )
.Map<TPHChild4>( m => m.Requires( "Dyskryminator" ).HasValue( "c4" ) );

...

实体已成功持久化,然后从数据库中检索。

我怀疑你发布的内容不多。

关于c# - 使用 TPH 的 Entity Framework 的多级继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32010796/

25 4 0
文章推荐: c# - 使用异步方法在 Teamcity 上运行 xUnit 测试
文章推荐: javascript - 这个箭头怎么画?
文章推荐: c# - 使用另一个列表的内容过滤一个列表
文章推荐: c# - 为什么我不能用 List> 实例化 List