2015-04-23 4 views
1

Я пытаюсь заменить столбец дискриминатора своей собственной константой (а не строковыми константами EF). Мои следующие классы:EF дискриминаторы с цепным наследованием

[Table("stor_store")] 
public abstract StoreBase { /* Base fields */ } 

public StoreTemplate : StoreBase {/* Extra fields */ } 

public Store : StoreBase {/* Extra fields */ } 

[Table("cust_customer")] 
public Customer : Store { /* Extra fields */ } 

[Table("engi_engineer")] 
public Engineer : Store {/* Extra fields */ } 

Я пытался отобразить столбец с помощью текучего API:

modelBuilder.Entity<StoreBase>() 
    .Map<StoreTemplate>(m => m.Requires("stor_type").HasValue((byte)0) 
    .Map<Store>(m => m.Requires("stor_type").HasValue((byte)1)) 
    .Map<Customer>(m => m.Requires("stor_type").HasValue((byte)2)) 
    .Map<Engineer>(m => m.Requires("stor_type").HasValue((byte)3)); 

Однако EF всегда создает столбец дискриминатора. Это сопоставление работало до этого, но двойное вложенное наследование, похоже, его бросило. Спасибо за любую помощь.

ответ

1

Я вижу вашу проблему здесь, и я думаю, что дело доходит до того, что уже назначено значение Store, поэтому, возможно, когда вы попытаетесь установить значение для унаследованных объектов, это не сработает?

Вы можете попробовать другой заказ: Переопределение не помогает!

modelBuilder.Entity<StoreBase>() 
.Map<StoreTemplate>(m => m.Requires("stor_type").HasValue((byte)0) 
.Map<Customer>(m => m.Requires("stor_type").HasValue((byte)2)) 
.Map<Engineer>(m => m.Requires("stor_type").HasValue((byte)3)) 
.Map<Store>(m => m.Requires("stor_type").HasValue((byte)1)); 

Альтернативный подход

Однако, как ваше наследство становится все более сложным, возможно, следует рассмотреть возможность реализации что-то вроде «таблицы для каждого типа» (ТРТ) стратегии? Этот подход будет разделять ваши типы на свои собственные таблицы, сохранять пустые столбцы для меньших дискриминаторов и давать вам более четкую структуру.

enter image description here

Вы можете найти полное описание детали здесь: http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt

+1

Я не решить мою проблему, дискриминатор все еще там после переназначения карты. Я думаю, что я пойду с TPT, хотя. – Tim

Смежные вопросы