2012-08-27 9 views
6

Ich konvertiere mein EF POCO-Projekt in Code zuerst. Ich hatte die T4-Vorlage geändert, so dass alle meine Entitäten eine Basisklasse EntityBase verwenden, die ihnen einige allgemeine Funktionen zur Verfügung stellt, die nicht persistenzbezogen sind.Vererben Sie eine gemeinsame Basisklasse in EF-Code zuerst

Wenn ich [NotMapped] Attribut auf EntityBase verwenden, erben alle Entitäten dieses Attribut, und ich bekomme The type 'X.X.Person' was not mapped, für jeden Typ, den ich versuche, mit EF zu verwenden.

Wenn ich [NotMapped] auf alle Eigenschaften von EntityBase verwenden, erhalte ich eine EntityType 'EntityBase' has no key defined. Define the key for this EntityType Ausnahme

FYI: Ich benutze Ef 4.3.1

Edit: Teil des Codes:

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

und dann

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

Für diese tw o Klassen gibt es nicht fließend api Konfiguration.

Antwort

4

Try EntityBase als abstract definieren, wenn es für Sie möglich ist, und setzen NotMapped ... auf die Eigenschaften Sie den Trick nicht zuordnen möchten sollten.

+1

Es ist schon abtract. – Alireza

+1

@ Alireza gut, Sie sprechen von CodeFirst und T4-Vorlage. Ist das wirklich CodeFirst? Können Sie zeigen, wo und wie Sie das Beziehungsmapping durchführen? Weil wir in CodeFirst eine abstrakte Basisklasse verwenden, und es funktioniert gut ... –

+0

Ich habe EF-Datenbank zuerst und POCO. Zu dieser Zeit hatte ich T4 gewechselt, so dass alle meine Klassen 'EntityBase' erben. Jetzt, wo wir zuerst zu Code gewechselt haben, existiert das T4 nicht mehr. – Alireza

3

Versuchen Sie, eine EntityBase-Tabelle (Great blog post darüber: Table Per Type Inheritence) zu erstellen, die alle Ihre Entitäten teilen, oder einfach ein Basisobjekt zu erstellen, damit alle Ihre Entitäten dieselben Methoden verwenden können? Ich hatte kein Problem mit dem Code, den Sie oben gepostet haben. Hier ist die Gesamtheit einer schnellen Test App:

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

Welche dieser Tabelle/Datenbank erstellt: enter image description here

+1

Danke. Ja, ich möchte nur eine Basisklasse erstellen. Auf Datenbankebene findet keine Vererbung von 'EntityBase' statt. Leider ist der komplette Code zu groß, um ihn irgendwo hochzuladen. Ich sollte versuchen, einen Grund zu finden, warum dies in meinem Code nicht funktioniert. – Alireza