Это возможно, но с одним общим дискриминатором на абстрактном уровне root, содержащим значения для всех возможных создаваемых (не абстрактных) прямых или косвенных производных сущностей.
Применение к вашему образцу требует удаления 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 }
Конфигурация:
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
.