0

假设我有一个 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 会是什么样子?

4

0 回答 0