假设我有一个 Activity 的实体模型聚合,如下所示:
public class Activity : Entity
{
public int PersonId { get; set; }
public virtual Person Person { get; set; }
public int Number { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public virtual ICollection<ActivityTag> Tags { get; set; }
}
public class ActivityTag : Entity
{
public int ActivityPersonId { get; set; }
public int ActivityNumber { get; set; }
public virtual Activity Activity { get; set; }
public int Number { get; set; }
public string Text { get; set; }
}
忘记 Activity 和 Person 之间的关系,但请注意 Activity 和 ActivityTag 之间的 1..* 关系。流畅的映射看起来或多或少像这样:
public class ActivityOrm : EntityTypeConfiguration<Activity>
{
public ActivityOrm()
{
ToTable("Activity", "Activities");
HasKey(p => new { p.PersonId, p.Number });
HasRequired(d => d.Person)
.WithMany()
.HasForeignKey(d => d.PersonId)
.WillCascadeOnDelete(true);
HasMany(p => p.Tags)
.WithRequired(d => d.Activity)
.HasForeignKey(d => new { d.ActivityPersonId, d.ActivityNumber })
.WillCascadeOnDelete(true);
Property(p => p.Content).HasColumnType("ntext");
}
}
public class ActivityTagOrm : EntityTypeConfiguration<ActivityTag>
{
public ActivityTagOrm()
{
ToTable("ActivityTag", "Activities");
HasKey(p => new { p.ActivityPersonId, p.ActivityNumber, p.Number });
Property(p => p.Text).IsRequired().HasMaxLength(500);
}
}
鉴于此,我想为Activity
实体引入一个新的集合属性:
public ICollection<DraftedTag> DraftedTags { get; set; }
该DraftedTag
实体应具有与ActivityTag
. 唯一应该不同的是它映射到的表。我尝试创建一个从 ActivityTag 派生的类,如下所示:
public class DraftedTag : ActivityTag
{
}
public class DraftedTagOrm : EntityTypeConfiguration<DraftedTag>
{
public DraftedTagOrm()
{
Map(m =>
{
m.MapInheritedProperties();
m.ToTable("DraftedTag", "Activities");
});
HasKey(p => new { p.ActivityPersonId, p.ActivityNumber, p.Number });
}
}
DraftedTagOrm 已添加到 modelBuilder.Configurations 集合中,但甚至没有将外键关联添加到 Activity,我得到以下异常:
属性“ActivityPersonId”不是“DraftedTag”类型的声明属性。使用 Ignore 方法或 NotMappedAttribute 数据注释验证该属性是否已从模型中显式排除。确保它是有效的原始属性。
当我将 ActivityTag 类和 ActivityTagOrm 构造函数中的代码完全复制到各自的 DraftTag 类/配置构造函数中时,它会按预期工作——我得到两个具有相同架构但名称不同的不同表。但是,每次我想对 ActivityTag 类进行更改时,我都必须在 DraftTag 类中进行相应的更改。
是否可以通过让 DraftTag 扩展 ActivityTag 来使此代码干燥?如果是这样,DraftTag 的 EntityTypeConfiguration 会是什么样子?