我正在尝试学习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); } } }
如果认为您的视图需要它,您可以考虑使用视图模型.在这种情况下,您需要从域对象中读取属性值,并将其设置为视图模型的实例并将其返回到视图.