ASP.NET MVC – 在何处放置数据库查询

我正在尝试学习ASP.NET MVC 4,我很困惑我应该把数据库查询放在哪里.我有 PHP的背景,特别是CodeIgniter,我习惯于将所有数据库查询放入模型中.我有这个问题:
db.Orders.Where(order => order.columnName == columnName).SingleOrDefault();

基于这个ASP.NET tutorial,我应该把它放在控制器中.但是,我发现这个StackOverflow question,它说我应该把它放在模型中(类似于我以前用PHP做的).对同一问题的另一个答案提到了创建包含所有查询的存储库模式/类.

所以我的问题是,在代码维护(可读性,更改效果等)方面,以下选项的优缺点是什么?

>控制器中的查询
>模型中的查询
>在单独的类/层中查询

解决方法

使用存储库模式处理此问题的简单方法.这不是最好的方法.但是会告诉您如何使用存储库模式处理这个问题.

创建一个存储库来执行所有数据库事务

public interface IRepository
{
  Order Getorder(int orderId);
}
public class Repository : IRepository
{
   YourDBContext db;
   public Repository()
   {
      db = new YourDBContext ();
   }
   public User Getorder(int orderId)
   {
      return db.Orders.FirstOrDefault(s=>s.OrderID==orderId);
   }
}

您可以在同一个项目中创建它(在“数据访问逻辑”下)或为此创建一个单独的类库(并将其引用到您使用它的任何地方).

现在在您的控制器中,在导入必要的命名空间后,只需创建存储库的对象并调用您感兴趣的方法即可

public OrderController :Controller
{
  protected IRepository repo;
  public OrderController()
  {
    repo=new Repository();
  }
  public OrderController(IRepository repositary)
  {
    // This constructor is for your Unit test project,// you can pass a mock repository here
    // Read dependency injection
    repo=repository;
  }
  public ActionResult details(int id)
  {
    var order=repo.Getorder(id);
    if(order!=null)
    {
      return View(order);
    }
  }
}

如果认为您的视图需要它,您可以考虑使用视图模型.在这种情况下,您需要从域对象中读取属性值,并将其设置为视图模型的实例并将其返回到视图.

随着代码/功能的增长,您可以将代码移动到不同的类/层/项目.

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...