簡體   English   中英

Entity Framework core 3.1.1 多級繼承

[英]Entity Framework core 3.1.1 Multilevel Inheritance

運行 add-migration(EF 核心 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);

Entity Framework Core 3.1.1 是否支持“多級繼承 TPH”?

這是可能的,但是在根抽象級別使用單個共享鑒別器包含所有可能的可創建(非抽象)直接或間接派生實體的值。

應用於您的示例需要刪除DiscriminatorLevel2屬性(列),從CustomerType枚舉中刪除Internal (假設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派生的所有最終實體的鑒別器值列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM