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());
    }