我有一个类TypeEntity
,它将作为几十个实体的基类。我正在使用TPC,所以我需要将基类的所有属性映射到具有具体类名称的表,并将Key
字段设置为数据库生成。
目前我正在使用EntityTypeConfiguration
为每个实体类型执行此操作,如下所示:
class LineItemType : EntityTypeConfiguration<Models.LineItemType>
{
public LineItemType()
{
this.Property(e => e.Key)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Map(e => e.MapInheritedProperties()
.ToTable(nameof(LineItemType)));
}
}
这很好用,但很重复。我必须记住为从TypeEntity
继承的每个类型创建配置类,设置密钥并映射继承的属性。这似乎是自定义Convention
的理想情况。
我创建了TypeEntityTpcConvention
Convention
,如下所示:
class TypeEntityTpcConvention : Convention
{
public TypeEntityTpcConvention()
{
this.Types<TypeEntity>()
.Configure(e => e.Property(p => p.Key)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity));
}
}
将Key
设置为生成数据库的方法,但我无法找到任何方法来访问约定内的属性的表映射。
理想情况下,我希望这样的事情:
this.Types<TypeEntity>()
.Configure(e => e.MapInheritedProperties()
.ToTable(e.ClrType.Name));
甚至对每个需要映射的属性进行这样的调用:
this.Types<TypeEntity>()
.Configure(e => e.Property(p=>p.Key)
.ToTable(e.ClrType.Name));
这两者似乎都不存在。有没有办法让我从Convention
?
经过一些额外的研究后,看起来有更多高级会议选项可用IStoreModelConvention
和IConceptualModelConvention
,但是有关如何使用这些选项的有用文档却非常缺乏。几个小时用断点和观察窗口探查它们之后,我还没有弄清楚如何使用这些接口来控制列映射。
我目前的解决方案是使用反射来查找从TypeEntity
中的OnModelCreating
继承的所有类型,并将属性映射到正确的表。这是有效的,但我更愿意使用一个约定,如果可能的话,因为这看起来像是为了制定约定的东西。我觉得我错过了一些明显的东西。
答案 0 :(得分:8)
据我所知,您可以在OnModelCreating
的{{1}}方法中编写类型配置,它与您在问题中提到的代码非常相似。
DbContext
如果这种方法有任何问题,请告诉我,我会重新访问该主题。
修改强>
完全相同的原则可以应用于惯例:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Types<TypeEntity>().Configure(c =>
{
c.HasKey(p => p.Key);
// probably not needed, but won't do any harm
c.Property(p => p.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
c.ToTable(c.ClrType.Name);
});
}
和
class TypeEntityConvention : Convention
{
public TypeEntityConvention()
{
this.Types<TypeEntity>().Configure(c =>
{
c.HasKey(p => p.Key);
c.Property(p => p.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
c.ToTable(c.ClrType.Name);
});
}
}