2011-01-10 93 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