2012-03-27 30 views
9

Tengo un objeto de base que no quiero ser mapeado en el PP como una entidad, sólo quiero las propiedades que se añaden al objeto que se asigna en el PP:Herencia EF Código-Primera

que no se asignaron objeto (no sé si es importante, pero es baseObject en otro montaje):

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

objeto mapeado:

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

lo que se registra en DbContext

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

Lo que me gustaría ver en dB

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

Para reanudar, lo que quiero hacer, es tener una tabla en el PP que tiene la base de las propiedades de niños y.

Este es el error que estoy recibiendo actualmente:

El tipo 'namespace.ChildObject' no fue asignada. Compruebe que el tipo no se haya excluido explícitamente mediante el método Ignore o la anotación de datos NotMappedAttribute. Verifique que el tipo se haya definido como una clase, que no sea primitivo, anidado o genérico, y que no herede de EntityObject.

He estado buscando, pero no puedo encontrar cómo hacerlo.

¿Alguna idea?

EDIT:

@ Kyle Trauberman es correcto, sin embargo, por alguna razón, parece que hay un problema con la herencia de una clase base de montaje diferente. Simplemente hice esto.

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

Entonces, ¿no desea que las propiedades definidas en la clase base estén mapeadas en la base de datos? ¿O los quieres mapeados? ¿Qué estás viendo ahora, frente a lo que quieres ver? –

+0

lo siento, podría no estar claro. Quise decir que no quiero que el objeto base se mapee como una entidad diferente, pero quiero que las propiedades se muestren en el objeto hijo. –

+0

Pude resolver mi caso similar con mi respuesta [aquí] (https://stackoverflow.com/a/45762308/1718832) – vk5880

Respuesta

10

Morteza Manavi tiene un blog que detalla cómo hacer esto:

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

Básicamente, tendrá que anular en su OnModelCreatingDbContext y llame MapInheritedProperties() para cada una de las tablas secundarias.

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 tenía toda una serie de publicaciones sobre herencia que debería consultar. Aquí está la parte 1: http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per- jerarquía-tph.aspx –

+0

Ya revisé este artículo, pero tal vez me falta algo porque aún arroja un error en el 'ChildObject' –

+1

Sería útil saber qué error está recibiendo. –