实体框架

时间:2016-05-12 20:14:53

标签: c# .net entity-framework

我有一个'master'Visual Studio项目,其中包含类似于:

的实体框架映射
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实体/ POCO,也使用EF进行映射:

public class ExtendedUser : User {

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

此实体没有额外的字段,但确实有各种特定于该应用程序的关系集合,并且只有该应用程序。

我的问题是我想继承在第一个VS项目中为User定义的映射。主User类将用于其他几个项目中,因此我需要避免重复映射。

如果我将映射定义为:

public class ExtendedUserMap : UserMap
{
    public UserMap()
    {

    }
}

然后我无法引用任何ExtendedUser属性,因为映射的类型为EntityTypeConfiguration<User>而不是EntityTypeConfiguration<ExtendedUser>

显然我不能从两个类继承,所以我不确定一个合适的方法来实现我想做的事。

如何定义ExtendedUserMap以便我可以使用User映射并包含ExtendedUser的导航属性?

1 个答案:

答案 0 :(得分: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.
    }
}