C# MVC中使用db连接的包装方法
我遵循了,我来到了他们使用数据库连接的部分(C# MVC中使用db连接的包装方法,c#,asp.net,asp.net-mvc,asp.net-mvc-4,dbcontext,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Dbcontext,我遵循了,我来到了他们使用数据库连接的部分(DbConnection是DbContext的子项)。我被教导创建这样的方法(使用包装): 但是Visual Studio为我生成了一个如下所示的控制器: public class StoreManagerController : Controller { private DbConnection db = new DbConnection(); // // GET: /StoreManager/ public Ac
DbConnection
是DbContext
的子项)。我被教导创建这样的方法(使用包装):
但是Visual Studio为我生成了一个如下所示的控制器:
public class StoreManagerController : Controller
{
private DbConnection db = new DbConnection();
//
// GET: /StoreManager/
public ActionResult Index()
{
var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
return View(albums.ToList());
}
...
}
我想,Visual Studio没有错,但为什么我被告知使用
将每个方法包装为使用以使连接尽可能短,并让用户使用单独的连接?这可能取决于应用程序的可用性;无论您是否需要持久连接,以及创建持久连接的成本(以及无数其他因素)
但对于初学者来说,您应该始终处理好连接(与第一个模式一样,不是Visual Studio建议的模式),然后根据新的需求或与性能相关的问题转移到其他模式
我在VisualStudio建议的选项中看到的最大问题是,您无法控制dbconception
对象的生存期,并将其留给垃圾收集器最终处理。这可能会使连接资源在一段相当不确定的时间内处于使用状态。我想,Visual Studio没有错,但为什么要我使用
db
的范围仅保留在大括号内。这可能是在C
中使用关键字的另一个目的。它定义了变量的范围,在上面的例子中,它是您的db
对象
现在,如果调试VisualStudio为您生成的代码,那么您会注意到每当创建控制器类的对象时,都会调用一个Dispose方法
,或者换句话说,在相应的控制器中调用一个action方法
由于以下原因,始终释放DBContext实例-
- 当您将更多对象及其引用加载到内存中时,上下文的内存消耗可能会迅速增加。这可能会导致性能问题
- 如果异常导致上下文处于不可恢复状态,则整个应用程序可能会终止
- 随着查询和更新数据的时间间隔的增加,遇到并发相关问题的可能性也会增加
有关更多信息-他们的示例可能是在Controller.Disposing(true)上提供一个覆盖来处理上下文。这就是T4模板在MVC5中所做的。如果是这样,那么其行为可能类似。但是,我仍然更喜欢使用using
语句的可读性,而不是依赖稍微不太明显的方法重写。但那只是我…如果你有一个需要访问上下文的私有方法,那么你需要让这个方法把上下文作为一个参数,或者让它对类可用。不过,我从不在控制器中直接使用上下文。是的。答案基于当前示例。在实际的生产型设计中,这些直接使用DbConnection
的操作类型应通过控制器可用的IDao
或IRepository
接口隔离到自身的一层中。
public class StoreManagerController : Controller
{
private DbConnection db = new DbConnection();
//
// GET: /StoreManager/
public ActionResult Index()
{
var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
return View(albums.ToList());
}
...
}
using(var db = new DbConnection())
{
var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
return View(albums.ToList());
}