请在阅读完答案后阅读我的最新动态:
我正在尝试应用存储库模式 作为Rob Conery's described “{em> MVC店面”下的his blog。 但我想问一些问题 在我应用这个设计之前我所拥有的 图案。
Rob制作了自己的“模特”并使用了一些 ORM“LINQ to SQL或Entity Framework(EF)”将他的数据库映射到 实体。
然后他使用了自定义存储库 给
IQueryable<myModel>
和 他制作的这些存储库 ORMEntities
与其Model
类之间的映射或“解析”。我在这里问的是什么:
是否可以在ORM
Entities
和我之间进行自定义映射 模型“classes
”并加载 我想要的属性?我希望 重点很明确。
POCO更新
**
**
毕竟并且就Rob Conery先生的观点而言,我有更好的解决方案:
POCO
s”并将它们放入我的“模型层”中,因此它们与“edmx”文件无关。POCO
”的此“DbContext
”模型ViewModels
”,以便从这些存储库中获取视图所需的信息。所以我 不需要在“EF模型”和“我的模型”之间再添加一层。我只是扭曲了我的模型并强制EF处理它。
我认为这种模式比Rob Conery更好。
答案 0 :(得分:19)
是的,如果您使用的是LINQ to SQL,则可能。您需要做的就是使用投影将您想要的数据提取到您选择的对象中。你不需要所有这些装饰界面和诸如此类的东西 - 如果你使用特定于视图的模型(听起来你需要) - 创建一个ViewModel类。
我们称之为ProductSummaryView:
public class ProductSummaryView{
public string Name {get;set;}
public decimal Price {get;set;}
}
现在从存储库中加载它:
var products= from p in _repository.GetAllProducts
where p.Price > 100
select new ProductSummaryView {
Name=p.ProductName,
Price=p.Price
}
这将拉动价格&gt;的所有产品。 100并返回IQueryable。此外,由于您只需要两列,因此在SQL调用中只会指定两列。
答案 1 :(得分:3)
对你的问题不是躲闪,但最终由你决定你的知识库如何运作。
高级前提是您的控制器会指向某个存储库界面,例如 IRepository<T> where T : IProduct
。其实现可以执行任何操作 - 从磁盘加载整个数据库并存储在内存中,然后解析LINQ表达式以返回内容。或者它可以返回一组固定的虚拟数据用于测试目的。因为您正在敲击存储库接口,所以您可以拥有任意数量的具体实现。
现在,如果您正在寻找对Rob特定实现的批评,我不确定它与Stack Overflow密切相关。
答案 2 :(得分:2)
虽然可以使用查询(与存储库模式无关)基于对该对象的列子集的查询来填充对象的一部分,但这并不是“正常”完成事情的方式。
如果要返回对象的子集,通常只使用该属性子集创建一个新类。这通常(在MVC世界视图中)被称为View Model类。然后,使用投影查询来填充新类。
无论您是否使用存储库模式,都可以完成所有这些操作。我认为这两个概念之间没有相互矛盾的重叠。
答案 3 :(得分:2)
请记住,IQueryable将所有加载延迟到最后一个负责任的时刻。您可能不必使用LINQ运算符加载所有数据来获取所需的数据。 ; )
尊重视图中域类的依赖关系,我会说不。为此使用ViewModel模式。它更易于维护;您可以使用AutoMapper来避免映射问题,并且它们在复合视图场景中非常灵活:)
根据新问题......答案是肯定的,你可以。正如Rob Conery所说,使用投影; ):
var query = from p in DataContext.Persons}
select new Persons
{
firstname = p.firstname,
lastname = p.lastname
});