我有一个使用EF CodeFirst方法的C#项目。我的问题是EF如何解释我的类并生成数据库表。 EF推断了太多的事情,而我的DB并不是我想要的。具体而言,它正在我的一个映射类中生成其他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列渲染。我不想要这个,因为我实际上有数十个其他“实体类型”将用于这种情况。这就是为什么我选择实体类似课程的原因。

我究竟做错了什么?还是有另一种方式我应该映射这些,因此EF可以按照我想要的方式处理事物。谢谢。

有帮助吗?

解决方案

EF完全不支持枚举,截至V4 CTP 5。它们可能包含在下一个版本中。

话虽如此,模式看起来(对我来说;从您的帖子中不清楚,您的意图可能有所不同) eav 为了我的安慰。由于通常的原因(Google It),我不喜欢这些,即使 enum 在EF中的支持。

为什么不映射到其他实体类型而不是枚举?

如果您以“这是我的业务需求”的形式提出一个问题,那么最好的策略是什么?”您可能会得到更好的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top