Наследование EntityTypeConfiguration для разных проектов в платформе Entity Framework

У меня есть проект "master" Visual Studio, который содержит сопоставления структур Entity Framework, похожие на:

public class UserMap : EntityTypeConfiguration<User>
{
    public UserMap()
    {
        // Table Mapping
        ToTable("Users");
        this.Property(x => x.Username).HasColumnName("Username");


        // Other mapping goes here
    }
}

Объект User, который отображается, является простым POCO:

 public class User {
     public string Username { get; set; }

     // Other properties omitted for brevity
 } 

У меня есть второй "дочерний" проект/приложение VS (который ссылается на главный проект), который имеет следующий ExtendedUser Entity/POCO, который также отображается с использованием EF:

public class ExtendedUser : User {

     // Extra navigation properties
     public ICollection<Order> Orders { get; set; }
}

Этот объект не имеет дополнительных полей, но имеет разные коллекции отношений, которые являются специфическими для этого приложения, и только это приложение.

Моя проблема в том, что я хотел бы наследовать отображение, определенное для User в первом проекте VS. Мастер User класс будет использоваться в нескольких других проектах, поэтому мне нужно избегать дублирования сопоставлений.

Если я определяю отображение как:

public class ExtendedUserMap : UserMap
{
    public UserMap()
    {

    }
}

Тогда я не могу ссылаться ни на один из свойств ExtendedUser, поскольку отображение имеет тип EntityTypeConfiguration<User> not EntityTypeConfiguration<ExtendedUser>.

Очевидно, что я не могу наследовать от двух классов, поэтому я не уверен в том, что вы достигнете того, что я хочу сделать.

Как я могу определить ExtendedUserMap, чтобы я мог использовать сопоставления User, а также включить свойства навигации для ExtendedUser?

Ответ 1

Вы можете определить класс базового сопоставления несколько иначе:

public abstract class UserMapBase<TUser> : EntityTypeConfiguration<TUser>
    where TUser : User
{
    protected UserMapBase()
    {
        // Table Mapping
        ToTable("Users");
        this.Property(x => x.Username).HasColumnName("Username");


        // Other mapping goes here
    }
}

Теперь у вас могут быть такие подклассы:

public class UserMap : UserMapBase<User>
{ }

public class ExtendedUserMap : UserMapBase<ExtendedUser>
{
    public ExtendedUserMap()
    {
        // map ExtendedUser properties here.
    }
}