5

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

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 类设置为层次结构的顶部和一个构建数据库的类,而所有其他模型应该只用于各种应用程序。

我不想使用自动映射器。我还做了相当多的手动编码,这只是浪费了我的时间,而且每一次修改都需要我返回存储库并重新编码——这让我很恼火。

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

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

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

感谢所有的提示 :)

4

2 回答 2

10

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

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

将此作为可重用的方法返回IQueryable<UserViewModel>,您可以做任何您想做的事情。

于 2012-05-04T08:29:10.287 回答
1

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

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

于 2015-11-20T12:49:13.360 回答