【问题标题】:EF Code First Multiple entities to same tableEF Code First 多个实体到同一个表
【发布时间】:2015-11-20 20:49:13
【问题描述】:

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

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 门户填充尽可能多的数据访问。

感谢所有提示:)

【问题讨论】:

  • 看看通用存储库模式。您只需要一个用于所有实体的单一基础存储库。我感受到了你的痛苦,我为每个实体使用了一个存储库,直到我发现了通用存储库模式。

标签: entity-framework ef-code-first


【解决方案1】:

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

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

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

【讨论】:

  • 我以前做过投影,但不是用可重用的方法。你的想法都帮助了我 + 我的代码现在看起来更加优雅。谢谢!
  • 数据库仍然返回不必要的数据,虽然不是很出色。我希望使用此方法从查询中删除一些 varchar(max)s,但它仍然返回所有数据并仅删除 Web 应用程序中的属性
  • 这对这种情况很好,但警告其他人关注性能
  • @BritishDeveloper:如果正确使用,投影不会加载不必要的列。你确定在做投影之前不打电话给ToListAsEnumerable吗?
  • 是的,某些 ToList() 是最后调用的东西。您是否检查过 SQL Profiler 以确保您准确地看到数据库中正在运行的内容?如果我正在做一些奇怪的事情,我会很感兴趣,我可以使用此方法修复以删除多余的数据
【解决方案2】:

实体框架中的表每层次结构TPH继承,代码优先

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

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多