2012-08-27 21 views
6

Primero estoy convirtiendo mi proyecto EF POCO en Código. Cambié la plantilla T4, de modo que todas mis entidades usan una clase base, EntityBase, que les proporciona una funcionalidad común que no está relacionada con la persistencia.Heredar una clase base común en el código EF primero

Si uso [NotMapped] atributo en EntityBase, todas las entidades heredan este atributo y me da una The type 'X.X.Person' was not mapped, para cualquier tipo de trato de usar con EF.

Si uso [NotMapped] en todas las propiedades de EntityBase, me sale una excepción EntityType 'EntityBase' has no key defined. Define the key for this EntityType

FYI: Use EF 4.3.1

Editar: parte del código:

[DataContract(IsReference = true)] 
public abstract class EntityBase : INotifyPropertyChanged, INotifyPropertyChanging 
{ 
    [NotMapped] 
    public virtual int? Key 
    { 
     get { return GetKeyExtractor(ConversionHelper.GetEntityType(this))(this); } 
    } 
    //other properties and methods! 
} 

y luego

[DataContract(IsReference = true), Table("Person", Schema = "PER")] 
public abstract partial class Person : BaseClasses.EntityBase, ISelfInitializer 
{ 
    #region Primitive Properties 
    private int? _personID; 
    [DataMember,Key] 
    public virtual int? PersonID 
    { 
     get{ return _personID; } 
     set{ SetPropertyValue<int?>(ref _personID, value, "PersonID"); } 
    } 
} 

Para estos tw o clases no hay una configuración api fluida.

Respuesta

4

Intente definir EntityBase como abstract, si es posible para usted, y ponga NotMapped ... en las propiedades que no desea asignar, haga el truco.

+1

Ya es abtract. – Alireza

+1

@Alireza, usted habla de la plantilla CodeFirst y T4. ¿Es esto realmente CodeFirst? ¿Puedes mostrar dónde y cómo haces el mapeo de relaciones? Porque usamos una clase abstracta base en CodeFirst, y está funcionando bien ... –

+0

Primero utilicé la base de datos EF y POCO. En ese momento, había cambiado T4 para que todas mis clases heredaran 'EntityBase'. Ahora que cambiamos al código primero, el T4 ya no existe. – Alireza

3

¿Está tratando de crear una tabla de EntityBase (gran entrada de blog sobre esto: Table Per Type Inheritence) que todas sus entidades comparten, o simplemente crear un objeto base para que todas sus entidades puedan usar los mismos métodos? No tuve ningún problema con el código que publicaste arriba. Aquí está la totalidad de una aplicación de prueba rápida:

[DataContract(IsReference = true)] 
public abstract class EntityBase 
{ 
    [NotMapped] 
    public virtual int? Key 
    { 
     get { return 1; } //GetKeyExtractor(ConversionHelper.GetEntityType(this))(this); } 
    } 
    // other properties and methods! 
} 

[DataContract(IsReference = true)] 
public partial class Person : EntityBase 
{ 
    private int? _personID; 
    [DataMember, Key] 
    public virtual int? PersonID 
    { 
     get { return _personID; } 
     set { _personID = value; } 
    } 
} 

public class CFContext : DbContext 
{ 
    public DbSet<Person> Employers { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Person p = new Person(); 
     Console.WriteLine(p.Key); 
    } 
} 

Qué creó esta mesa/base de datos: enter image description here

+1

Gracias. Sí, quiero crear solo una clase base. No hay herencia de 'EntityBase' en el nivel de la base de datos. Desafortunadamente, el código completo es demasiado grande para cargarlo en alguna parte. Debería intentar encontrar una razón por la cual esto no funciona en mi código. – Alireza

Cuestiones relacionadas