EF Code First多个实体到同一个表

Adm*_*vić 5 entity-framework ef-code-first

我感兴趣的是如何通过首先使用代码将两个实体映射到同一个表.这是一个例子:

public class User
{
    [Key]
    public int UserId { get; set; }
    public string Name { get; set; }
    public byte Age { get; set; }
    public bool Active { get; set; }
    public DateTime Created { get; set; }
}

public class UserViewModel
{
    [Key]
    public int UserId { get; set; }
    public string Name { get; set; }
    public byte Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

基本上我厌倦了构建存储库.我想在模型构建器中映射配置门户,用户门户,其他服务的所有可能模型,并且只需使用DbContext.我想将User类设置为层次结构的顶层和构建数据库的类,而所有其他模型应该只用于各种应用程序.

我不想使用automapper.我也做了大量的手工编码,这只是浪费了我的时间,每一次修改都要求我回到存储库并重新编码 - 这让我很烦.

我试图在模型构建器中使用它,但它警告我层次结构无效:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().Map(p => { p.ToTable("Users"); });
        modelBuilder.Entity<UserViewModel>().Map(p => { p.ToTable("Users"); });
    }
Run Code Online (Sandbox Code Playgroud)

还要记住,我并没有尝试实现"表格分割".我不希望我的表被分成两个实体,我希望所有列都可以为空,除了一个主键,并允许不同的应用程序/ Web服务/ Web门户填充尽可能多的数据访问权限.

感谢所有的提示 :)

Lad*_*nka 9

你不能.一个表=一个实体(高级映射除外,如提到的表拆分和TPH继承).视图模型不是和实体.它只是数据/投影的视图,所以这样处理它.您将始终与用户和项目用户一起查看所需的模型:

var view = from u in context.Users
           select new UserViewModel
              {
                  UserId = u.UserId,
                  Name = u.Name,
                  Age = u.Age
              };
Run Code Online (Sandbox Code Playgroud)

将此作为可重复使用的方法返回IQueryable<UserViewModel>,您可以随心所欲.