Причина в стороне, я недавно столкнулся с той же проблемой, но считаю, что она все еще актуальна для v4 EF Framework .
Сначала создайте представление, которое выбирает значение дискриминатора в два столбца.
create view dbo.vw_BillingDetail
as
select BillingDetailId, DiscriminatorValue, DiscriminatorValue as DiscriminatorValue2 from dbo.BillingDetail
go
Во-вторых, сопоставьте представление с вашей сущностью во время создания контекста:
modelBuilder
.Entity<BillingDetail>()
.HasKey(n => n.BillingDetailId)
.Map(map =>
{
map.ToTable("vw_Person");
})
В-третьих, определите ваше отображение дискриминатора для вашего производного класса, используя один из столбцов в вашем представлении:
.Map<MyDerivedBillingDetail>(map =>
{
map.Requires("DiscriminatorValue2").HasValue("YourValue");
})
Наконец, определите получатель и частный установщик для другого столбца дискриминатора в вашем представлении с аннотацией DatabaseGenerated
, установленной как Computed
, чтобы предотвратить обновление / вставку EF для этого поля:
class BillingDetail
{
public BillingDetailId { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DiscriminatorValue { get; private set; }
}
Вы можете изменить частный установщик для защиты и установить это значение явно во время создания ваших производных сущностей, чтобы дискриминатор имел значение до его сохранения:
class MyDerivedBillingDetail : BillingDetail
{
public MyDerivedBillingDetail()
{
this.DiscriminatorValue = "MyValue";
}
}