2012-08-27 4 views
6

Sto convertendo il mio progetto EF POCO in Codice prima. Avevo cambiato il modello T4, in modo che tutte le mie entità usassero una classe base, EntityBase, che fornisce loro alcune funzionalità comuni che non sono correlate alla persistenza.Eredita una classe base comune nel codice EF prima

Se utilizzo l'attributo [NotMapped] su EntityBase, tutte le entità ereditano questo attributo e ottengo uno The type 'X.X.Person' was not mapped, per qualsiasi tipo che cerco di utilizzare con EF.

Se uso [NotMapped] su tutte le proprietà di EntityBase, ottengo un'eccezione EntityType 'EntityBase' has no key defined. Define the key for this EntityType

FYI: Io uso Ef 4.3.1

Edit: parte del codice:

[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! 
} 

e poi

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

Per questi tw o le classi non hanno una configurazione API fluente.

risposta

4

Provare a definire EntityBase come abstract, se è possibile per voi, e inserire NotMapped ... sulle proprietà che non si desidera mappare dovrebbe fare il trucco.

+1

E 'già abtract. – Alireza

+1

@Alireza bene, parli di CodeFirst e del modello T4. Questo è veramente CodeFirst? Puoi mostrare dove e come si realizza la relazione? Perché usiamo una classe astratta di base in CodeFirst, e funziona bene ... –

+0

Ho usato il database EF prima e POCO. A quel tempo avevo cambiato T4 in modo che tutte le mie classi ereditassero 'EntityBase'. Ora che siamo passati al codice, il T4 non esiste più. – Alireza

3

Stai cercando di creare una tabella di EntityBase (Post di blog di grandi dimensioni su questo: Table Per Type Inheritence) che tutte le entità condividono o semplicemente creare un oggetto di base in modo che tutte le entità possano utilizzare gli stessi metodi? Non ho avuto alcun problema con il codice che hai postato sopra. Ecco la totalità di un app test veloce:

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

che ha creato questa tabella/database: enter image description here

+1

Grazie. Sì, voglio creare solo una classe base. Nessuna ereditarietà di "EntityBase" si verifica a livello di Database. Sfortunatamente, il codice completo è troppo grande per essere caricato da qualche parte. Dovrei provare a trovare una ragione per cui questo non funziona nel mio codice. – Alireza