Mai*_*... 2 c# table-per-hierarchy entity-framework-core
运行 add-migration 时抛出异常(EF core 3.1.1):
CLR 属性“DiscriminatorLevel2Id”无法添加到实体类型“CustomerBase”,因为它是在 CLR 类型“InternalCustomer”上声明的
下图显示了所需的层次结构(简要):
映射看起来像:
// 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);
Run Code Online (Sandbox Code Playgroud)
Entity Framework Core 3.1.1 是否支持“多级继承 TPH”?
这是可能的,但在根抽象级别使用单个共享鉴别器,其中包含所有可能的可创建(非抽象)直接或间接派生实体的值。
应用于您的示例需要删除DiscriminatorLevel2属性(列),Internal从CustomerType枚举中删除(假设InternalCustomer是抽象的)并合并Regular到VIP其中,例如如下所示:
模型:
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 }
Run Code Online (Sandbox Code Playgroud)
配置:
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>();
Run Code Online (Sandbox Code Playgroud)
当您想要查询InternalCustomer派生实体时,可以使用db.Set<InternalCustomer>()or db.Set<CustomerBase>().OfType<InternalCustomer>(),EF Core 将应用类似于 的过滤器t.CustomerTypeId IN (1,2),即该IN子句将包含从 派生的所有最终实体的鉴别器值列表InternalCustomer。
| 归档时间: |
|
| 查看次数: |
2587 次 |
| 最近记录: |