关于Rob Conery的存储库模式的一些问题

Wah*_*tar 9 asp.net-mvc orm entity-framework poco repository-pattern

阅读答案后,请在问题末尾阅读我的更新:

我正在尝试将存储库模式应用于Rob Conery他的博客 " MVC Storefront " 下所描述的.但是我想问一下在应用这个设计模式之前我遇到的一些问题.

Rob制作了自己的"模型"并使用了一些ORM"LINQ to SQL或Entity Framework(EF)"将他的数据库映射到实体.

然后,他使用自定义存储库,IQueryable<myModel>在这些存储库中,他在ORM 和他的之间进行了一种 映射或"解析" .EntitiesModel

我在这里问的是:

是否可以在ORM Entities和我的模型" classes" 之间进行自定义映射,并加载我想要的属性?我希望这一点很清楚.

更新POCO

**

这是我在经过许多建议和许多尝试之后决定的:

**

毕竟,就Rob Conery先生的观点而言,我有更好的解决方案:

  1. 我将我的模型构建为" POCOs"并将它们放入我的"模型层"中,因此它们与"edmx"文件无关.
  2. 构建我的存储库来处理POCO依赖于" DbContext"的这个" "模型
  3. 然后我创建了一个" ViewModels"来获取这些存储库中视图所需的信息.

所以,我并不需要添加更多的层是"EF模型"和"我的模式"之间.我只是扭曲了我的模型并强制EF处理它.

我认为这种模式比Rob Conery更好.

小智 19

是的,如果您正在使用LINQ to SQL,那么这是可能的.您需要做的就是使用投影将您想要的数据提取到您选择的对象中.你不需要所有这些带有接口和诸如此类的装饰 - 如果你使用特定于视图的模型(它听起来你需要) - 创建一个ViewModel类.

我们称之为ProductSummaryView:

public class ProductSummaryView{
   public string Name {get;set;}
   public decimal Price {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

现在从存储库加载它:

var products= from p in _repository.GetAllProducts
              where p.Price > 100
              select new ProductSummaryView {
                  Name=p.ProductName,
                  Price=p.Price

              }
Run Code Online (Sandbox Code Playgroud)

这将拉出价格> 100的所有产品并返回IQueryable.此外,由于您只需要两列,因此在SQL调用中只会指定两列.

  • 您的ViewModel应该是UI位 - 而不是模型.这是一种"自适应"模式,可帮助Web应用程序处理模型数据 - 您希望将其保留在使用它的位置. (2认同)