Наследование EF Code-First - PullRequest
9 голосов
/ 27 марта 2012

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

Не сопоставленный объект (незнать, если это важно, но базовый объект находится в другой сборке):

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; }

What i 'Я хотел бы видеть в Db

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

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

Этоошибка, которую я сейчас получаю:

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

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

Есть идеи?

РЕДАКТИРОВАТЬ:

@ Кайл Трауберман прав, однако, по некоторым причинам, похоже, есть проблема с наследованием отбазовый класс в разных сборках.Я просто сделал это.

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; }
}

1 Ответ

10 голосов
/ 27 марта 2012

У Мортезы Манави есть запись в блоге, подробно рассказывающая, как это сделать:

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");
    });            
}
...