我们正在使用ASP.NET MVC4开发项目。在团队的一次会议中,出现了使用每个请求会话的想法 图案。
我进行了一些搜索,并在SO中发现了一些问题 - 一般来说 - 这种模式(如果可以称之为)它表示给框架ORM。
一个小例子
//GET Controller/Test
public ActionResult Test()
{
//open database connection
var model = new TestViewModel
{
Clients = _clientService.GetClients(),
Products = _productService.GetProducts()
};
//close database connection
return View(model);
}
每个请求没有会话:
//GET Controller/Test
public ActionResult Test()
{
var model = new TestViewModel
{
Clients = _clientService.GetClients(), // Open and close database connection
Products = _productService.GetProducts() // Open and close database connection.
};
return View(model);
}
质疑
答案 0 :(得分:7)
看起来你的意思是“每个请求的数据库上下文”。您可以使用工作单元模式来实现它。
您可以在本文中检查Radu Pascal的简单实现:https://www.codeproject.com/Articles/243914/Entity-Framework-context-per-request
另一个实现(对于Entity Framework和NHibernate),您可以在ASP.NET Boilerplate中找到更复杂的内容:http://www.aspnetboilerplate.com/Pages/Documents/Unit-Of-Work
答案 1 :(得分:2)
在Web(Web应用程序,wcf,asp.net web api)中,每个请求使用一个DB上下文是个好主意。为什么?因为请求是短暂的,至少这是想法,或者您的应用程序响应时间很慢,因此创建许多数据库上下文没有意义。
例如,如果您使用EF作为ORM并向Find
方法发出请求,则EF将首先在db上下文的本地缓存中搜索您要求的内容。如果找到它,它将简单地返回它。如果
没有找到,它将进入数据库并将其拉出并保存在缓存中。在您的Web应用程序完成请求之前,您多次查询相同项目的情况下,这可能非常有用。如果您创建一个上下文,查询某些内容,关闭上下文,那么您可能会多次访问数据库,这是可以避免的。
进一步详细说明,假设您创建了许多新记录:客户记录,订单记录,然后做一些工作,然后根据您为客户创建一些折扣记录的条件,然后是其他一些记录,然后是一些订单记录。如果您使用Single Context Per-Request
方法,则可以继续添加它们并在结尾处调用SaveChanges
。 EF将在一个事务中执行此操作:要么它们都成功,要么每个事物都被回滚。这很好,因为您在没有创建事务的情况下获得了事务性行为。如果你没有采用Single Context Per-Request
方法,那么你需要自己处理这些事情。这并不意味着在Single
方法中,一切都需要在一个事务中:您可以在同一个http请求中根据需要多次调用SaveChanges
。考虑其他可能性,你拉一个记录,然后决定编辑记录,然后再编辑它:再次在Single
方法中,它将全部应用于同一个对象,然后一次保存
除了上述内容之外,如果您还想阅读更多信息,那么您可能会发现this有帮助。此外,如果您搜索单个上下文每个请求,您会发现许多文章。