2011-01-10 98 views
0

我有一個使用EF CodeFirst方法的C#項目。我的問題是EF如何解釋我的類並生成數據庫表。 EF推斷太多東西,而我的結果數據庫並不是我想要的。具體來說,它是在我的一個映射類中生成附加的id列。覆蓋EF CodeFirst生成的數據庫

這裏是我的POCO類:

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

我的映射類是典型的,但這裏是EntityAttributeMap類:

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

我所有的單元測試達到預期效果。但是,表EntityAttribute使用DonorId和GrantId列進行呈現。我不想要這個,因爲我實際上有幾十個將用於這個場景的「EntityTypes」。這就是我選擇EntityTypeEnum類的原因。

我在做什麼錯?還是有另一種方式我應該映射這些,以便EF按照我想要的方式處理事物。謝謝。

回答

1

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

說了這麼多,該模式看起來(對我來說,它不是從您的帖子清晰,你的意圖可能會有所不同)太靠近EAV安慰我。對於通常的原因(谷歌它),我不喜歡這些,並且即使在EF中支持enum也不希望這樣的模型。

爲什麼不映射到另一個實體類型而不是枚舉?

如果您以「這是我的業務需求;這是什麼最佳模式?」的形式提出問題?你可能會得到更好的答案。

+1

我想我正按照你的建議轉向EAV。我只是在努力提高效率。鑑於我將有許多實體映射到我的屬性表,您是否會爲一個映射表中的每個實體/屬性組合或多個實體ID列建議單獨的映射表。這個我猜的缺點是會有很多空值。另外,感謝提出框架建議的問題。 – trevorc 2011-01-10 22:22:06