我感兴趣的是如何通过首先使用代码将两个实体映射到同一个表。这是一个例子:
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门户填充尽可能多的数据访问。
感谢所有提示:)
答案 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