重写EF代码首先生成数据库

时间:2011-01-10 21:24:39

标签: entity-framework ef-code-first

我有一个使用EF CodeFirst方法的C#项目。我的问题是EF如何解释我的类并生成数据库表。 EF推断太多东西,我得到的数据库不是我想要的方式。具体来说,它在我的一个映射类中生成了额外的id列。

以下是我的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 个答案:

答案 0 :(得分: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支持,也不会想要那种模型。

为什么不映射到另一个实体类型而不是枚举?

如果您以“这是我的业务需求;这是什么最好的架构?”的形式提出问题。你可能会得到更好的答案。