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

时间:2012-05-03 18:52:57

标签: 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; }
}

基本上我厌倦了构建存储库。我想在模型构建器中映射配置门户,用户门户,其他服务的所有可能模型,并且只需使用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"); });
    }

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

感谢所有提示:)

2 个答案:

答案 0 :(得分:9)

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

var view = from u in context.Users
           select new UserViewModel
              {
                  UserId = u.UserId,
                  Name = u.Name,
                  Age = u.Age
              };

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

答案 1 :(得分:1)

Table Per Hierarchy实体框架中的TPH继承,代码优先

https://www.youtube.com/watch?v=2i7jahkpeQ8&list=PL6n9fhu94yhUPBSX-E2aJCnCR3-_6zBZx&index=19