覆盖EF CodeFirst生成的数据库
-
09-10-2019 - |
题
我有一个使用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中的支持。
为什么不映射到其他实体类型而不是枚举?
如果您以“这是我的业务需求”的形式提出一个问题,那么最好的策略是什么?”您可能会得到更好的答案。
不隶属于 StackOverflow