2011-01-10 20 views
0

Ich habe ein C# -Projekt, das den EF CodeFirst-Ansatz verwendet. Mein Problem ist, wie EF meine Klassen interpretiert und die Datenbanktabellen generiert. EF schließt zu viele Dinge ab und meine resultierende db ist nicht so, wie ich es möchte. Insbesondere generiert es zusätzliche ID-Spalten in einer meiner Mapping-Klassen.Überschreibende EF-CodeFirst generierte Datenbank

Hier sind meine POCO Klassen:

public partial class Attribute 
    { 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public virtual ICollection<EntityAttribute> EntityAttributes {get;set;} 
    } 

    public partial class Grant 
    { 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public virtual ICollection<EntityAttribute> EntityAttributes {get;set;} 
    } 

    public partial class Donor 
    { 
    public int Id {get;set;} 
    public string Name {get;set;} 
    public virtual ICollection<EntityAttribute> EntityAttributes {get;set;} 
    } 

    public enum EntityTypeEnum 
    { 
    Grant = 1, 
    Donor = 2 
    } 

    public partial class EntityAttribute 
    { 
    public int Id {get;set;} 
    public int EntityId {get;set;} 
    public int AttributeId {get;set;} 
    public int EntityTypeId {get;set;} 
    public EntityTypeEnum EntityType 
    { 
     get{return (EntityTypeEnum)this.EntityTypeId;} 
     set{this.EntityTypeId = (int)value;} 
    } 
    public virtual Grant Grant {get;set;} 
    public virtual Donor Donor {get;set;} 
} 

Meine Mapping Klassen typisch sind, aber hier ist die EntityAttributeMap Klasse:

public partial class EntityAttributeMap : EntityTypeConfiguration<EntityAttribute> 
{ 
public EntityAttributeMap() 
{ 
this.ToTable("EntityAttribute"); 
this.HasKey(ea => ea.Id); 
this.Property(ea => ea.EntityTypeId).IsRequired(); 
this.Ignore(ea => ea.EntityType); 

this.HasRequired(ea => ea.Grant) 
    .WithMany(g => g.EntityAttributes) 
    .HasForeignKey(ea => ea.EntityId); 

this.HasRequired(ea => ea.Donor) 
    .WithMany(d => d.EntityAttributes) 
    .HasForeignKey(ea => ea.EntityId); 

this.HasRequired(ea => ea.Attribute) 
    .WithMany(a => a.EntityAttributes) 
    .HasForeignKey(ea => ea.AttributeId) 
} 
} 

Alle meine Unit-Tests durchführen, wie erwartet. Die Tabelle EntityAttribute wird jedoch mit den Spalten DonorId und GrantId gerendert. Ich möchte das nicht, da ich tatsächlich Dutzende anderer "EntityTypes" habe, die für dieses Szenario verwendet werden. Aus diesem Grund habe ich die EntityTypeEnum-Klasse gewählt.

Was mache ich falsch? Oder gibt es eine andere Art, wie ich diese abbilden sollte, damit EF die Dinge so behandelt, wie ich es möchte. Vielen Dank.

Antwort

1

The EF doesn't support enums at all, as of V4 CTP 5. They might be included in the next release.

gesagt hat, dass das Schema aussieht (mir, es aus Ihrem Post nicht klar ist, und Ihre Absichten können anders sein) zu einem EAV für meinen Komfort zu nah. Aus den üblichen Gründen (Google it) mag ich diese nicht, und würde diese Art von Modell auch nicht mit enum Unterstützung in der EF wollen.

Warum nicht zu einem anderen Entitätstyp als einer Enumeration zuordnen?

Wenn Sie eine Frage in Form von "Hier sind meine geschäftlichen Anforderungen, was ist das beste Schema dafür?" Sie können eine bessere Antwort bekommen.

+1

Ich schätze, ich schwanke auf EAV, wie Sie vorgeschlagen haben. Ich habe nur versucht, effizient zu sein. In Anbetracht der Tatsache, dass zahlreiche Entitäten meiner Attributtabelle zugeordnet werden, schlagen Sie eine separate Zuordnungstabelle für jede Entitäts-/Attributkombination oder mehrere Entitäts-ID-Spalten in einer Zuordnungstabelle vor. Der Nachteil davon wäre, denke ich, eine Menge Nullen. Danke auch für die Frage, die Vorschläge einrahmen. – trevorc

+0

Viele Nullen können kein Problem sein. In SQL Server 2008+ können Sie z. B. Spalten "SPARSE" deklarieren, die den Server "für überwiegend NULL-Werte optimieren" anweisen. –

+0

Oh, und in Bezug auf eine Tabelle vs. viele, lesen Sie auf TPH vs TPT Vererbung Modellierung in der EF. Auch wenn Sie keine Vererbung * an sich vornehmen, * sind die Leistungsüberlegungen gleich. –