2012-03-27 8 views
9

У меня есть базовый объект, который я не хочу быть отображены в БД как объект, я только хочу, чтобы свойства, которые будут добавлены к объекту, который отображается в БД:Наследование EF Code-First

Не отображается объект (не знаю, если это имеет значение, но BaseObject в другой сборке):

public class BaseObject 
{ 
    public virtual string Prop1 { get; set; } 
    public virtual string Prop2 { get; set; } 
} 

отображенный объект:

public class ChildObject : BaseObject 
{ 
    public virtual string Prop3 { get; set; } 
    public virtual string Prop4 { get; set; } 
    public virtual string Prop5 { get; set; } 
} 

Что регистрируется в DbContext

public DbSet<ChildObject> ChildObjects { get; set; } 

Что я хотел бы видеть в Db

table:ChildObject 
    col:Prop1 (from BaseObject) 
    col:Prop2 (from BaseObject) 
    col:Prop3 
    col:Prop4 
    col:Prop5 

Чтобы возобновить, что я хочу сделать, это иметь одну таблицу в Дб, которая имеет ребенка и основные свойства.

Это ошибка я в настоящее время получаю:

типа «namespace.ChildObject» не отображается. Убедитесь, что тип не был явно исключен с помощью метода Ignore или Аннотации данных NotMappedAttribute. Убедитесь, что тип был определен как класс, не является примитивным, вложенным или общим и не наследует от EntityObject.

Я копался, но не могу найти, как это сделать.

Любые идеи?

EDIT:

@Kyle Trauberman является правильным, однако, по какой-то причине, как представляется, проблема с наследованием от базового класса в другой сборке. Я просто сделал это.

class BaseObjectClone : BaseObject { } /* BaseObject being in another assembly */ 

public class ChildObject : BaseObjectClone { 
    public virtual string Prop3 { get; set; } 
    public virtual string Prop4 { get; set; } 
    public virtual string Prop5 { get; set; } 
} 
+2

Итак, вы не хотите, чтобы свойства, определенные в базовом классе, сопоставлены с базой данных? Или вы хотите, чтобы они отображались? Что вы видите сейчас, а что вы хотите видеть? –

+0

жаль, что это может быть непонятно. Я имел в виду, что я не хочу, чтобы baseobject отображался как другой объект, но я хочу, чтобы свойства отображались в дочернем объекте. –

+0

Я смог решить свой подобный случай с моим ответом [здесь] (https://stackoverflow.com/a/45762308/1718832) – vk5880

ответ

10

Morteza Манави имеет запись в блоге с подробным описанием, как это сделать:

http://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx

В принципе, вам нужно переопределить OnModelCreating в вашем DbContext и вызвать MapInheritedProperties() для каждого из дочерних таблиц.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<BankAccount>().Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("BankAccounts"); 
    }); 

    modelBuilder.Entity<CreditCard>().Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("CreditCards"); 
    });    
} 
+0

У Morteza была целая серия сообщений о наследовании, которые вы должны проверить. Вот часть 1: http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per- иерархия-TPH.aspx –

+0

Я уже просмотрел эту статью, но, возможно, мне что-то не хватает, потому что она все еще бросает ошибку в «ChildObject». –

+1

Было бы полезно узнать, какую ошибку вы получаете. –

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