gpt4 book ai didi

c# - Entity Framework核心3.1.1多级继承

转载 作者:行者123 更新时间:2023-12-02 19:41:33 25 4
gpt4 key购买 nike

运行 add-migration 时抛出异常(EF core 3.1.1):

CLR property 'DiscriminatorLevel2Id' cannot be added to entity type 'CustomerBase' because it is declared on the CLR type 'InternalCustomer'

下图显示了所需的层次结构(简要):

Class Diagram

映射如下:

// Discriminator (Level 1)
modelBuilder.Entity<CustomerBase>()
.HasDiscriminator(b => b.CustomerTypeId)
.HasValue<InternalCustomer>((int)CustomerType.Internal)
.HasValue<ExternalCustomer>((int)CustomerType.External);

// Discriminator (Level 2)
modelBuilder.Entity<InternalCustomer>()
.HasDiscriminator(b => b.DiscriminatorLevel2Id)
.HasValue<VIPCustomer>((int)DiscriminatorLevel2.VIP)
.HasValue<RegularCustomer>((int)DiscriminatorLevel2.Regular);

Entity Framework Core 3.1.1 是否支持“多级继承 TPH”?

最佳答案

这是可能的,但在根抽象级别有一个共享鉴别器,包含所有可能的可创建(非抽象)直接或间接派生实体的值。

应用于您的示例需要删除 DiscriminatorLevel2属性(列),删除 Internal来自CustomerType枚举(假设 InternalCustomer 是抽象的)并合并 RegularVIP进入其中,例如像这样的东西:

型号:

public abstract class CustomerBase
{
public int Id { get; set; }
public string Name { get; set; }
public int CustomerTypeId { get; set; }
}

public abstract class InternalCustomer : CustomerBase
{
public decimal Points { get; set; }
}

public class RegularCustomer : InternalCustomer
{
public int PartnerId { get; set; }
}

public class VIPCustomer : InternalCustomer
{
public string CardNo { get; set; }
}

public class ExternalCustomer : CustomerBase
{
}

public enum CustomerType { External, Regular, VIP }

配置:

modelBuilder.Entity<CustomerBase>()
.HasDiscriminator(b => b.CustomerTypeId)
.HasValue<ExternalCustomer>((int)CustomerType.External)
.HasValue<VIPCustomer>((int)CustomerType.VIP)
.HasValue<RegularCustomer>((int)CustomerType.Regular);

modelBuilder.Entity<InternalCustomer>();

当你想查询InternalCustomer时派生实体,您可以使用 db.Set<InternalCustomer>()db.Set<CustomerBase>().OfType<InternalCustomer>() EF Core 将应用类似于 t.CustomerTypeId IN (1,2) 的过滤器,即 IN子句将包含从 InternalCustomer 派生的所有最终实体的鉴别器值列表。 .

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

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