0

我有一个使用 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 以我想要的方式处理事情。谢谢。

4

1 回答 1

1

从 V4 CTP 5 开始,EF 根本不支持枚举。它们可能包含在下一个版本中。

话虽如此,架构看起来(对我来说;从您的帖子中不清楚,并且您的意图可能不同)太接近EAV让我感到安慰。enum出于通常的原因(谷歌),我不喜欢这些,即使在 EF 中得到支持也不想要那种模型。

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

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

于 2011-01-10T22:15:14.957 回答