我来自PHP,在尝试在一个视图中显示来自多个实体的数据时,我真的很难使用一种模型/一种视图方法。
我一直在用EF学习asp.net mvc 4大约一个月,但仍然找不到解决这个问题的好工作方案。
我目前的方法是通过工作单元访问数据库,为每个实体创建存储库(数据库中的表)
public GenericRepository<Domain> DomainRepository
{
get
{
if (this.domainRepository == null)
{
this.domainRepository = new GenericRepository<Domain>(context);
}
return domainRepository;
}
}
然后存储库保存来自给定实体(在此方案数据库中)的数据,
public GenericRepository(PanelContext context)
{
this.context = context;
this.dbSet = context.Set<TTypeParam>();
}
并使用方法过滤数据等。
使用单个存储库为给定视图提供服务不是问题,因为它只使用一个模型(实体)。
当我尝试创建包含ex的模型类(Combined)时。两个模型(Domain和Domain2)它不是给定上下文的一部分,因为该实体不存在所以在视图中使用@model namespace.Models.Combined是没有意义的。
现在我正在使用元组从多个存储库中提取数据并使用它来填充强类型的View但我知道必须有更好的方法......
基本上问题是如何创建(抽象)?模型类(实体)?这将保存来自多个存储库的数据并作为给定View的viewmodel?
非常感谢任何帮助。
答案 0 :(得分:0)
首先,视图模型不是db实体。它只是一个用于发送数据以查看的存储桶。控制器使用模型(存储库,服务)中所需的所有数据填充该视图模型。
因此,如果您的视图模型是Combined类型,控制器将询问存储库(不是EF上的包装器,忘记您在asp.net mvc网站上看到的示例或ef教程,它们是错误的并教您数据库的存储库反模式,可能是也可能不是视图模型所依赖的格式。如果不是,则创建一些扩展方法,您可以在其中将repos返回的对象映射到视图模型。
因此,视图模型为View提供服务,它由控制器填充来自存储库的数据。这样,View与模型分离,因为它只知道视图模型。