在MVC中使用db连接的包装方法

时间:2014-02-24 16:26:14

标签: c# asp.net asp.net-mvc asp.net-mvc-4 dbcontext

我正在关注MVC music store tutorial,我来到他们使用数据库连接的部分(DbConnectionDbContext的孩子)。我被教导要创建这样的方法(使用包装):

public class StoreManagerController : Controller
{
    //
    // GET: /StoreManager/

    public ActionResult Index()
    {
        using(var db = new DbConnection())
        {
            var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
            return View(albums.ToList());
        }
    }

    ...
}

但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没有错,但为什么我被告知用using包装每个方法以使连接尽可能短,并且用户也使用单独的连接?

2 个答案:

答案 0 :(得分:2)

我认为,Visual Studio没有错,但为什么我被告知要使用包装每个方法

    using(var db = new DbConnection())
    {
        var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
        return View(albums.ToList());
    }

db的范围仅限于大括号内。这可能是using关键字在C#中提供的另一个目的。它定义了变量的范围,在上面的例子中它是你的db对象。

现在,如果您调试visual studio为您生成的代码,那么您会注意到每次调用控制器类的对象时都会调用Dispose method,或者换句话说,就是一个动作方法在相应的Controller中调用。

由于以下内容,始终处理DBContext实例 -

  • 当您将更多对象及其引用加载到内存中时,上下文的内存消耗可能会迅速增加。这可能会导致性能问题。

  • 如果异常导致上下文处于不可恢复状态,整个应用程序可能会终止。

  • 随着查询和更新数据的时间之间的差距越来越大,遇到与并发相关的问题的可能性也会增加。

了解详情 - Reference

答案 1 :(得分:1)

这可能取决于您的应用的可用性;是否需要持久连接,以及创建一个连接的成本(以及无数其他因素)。

但是对于初学者来说,你应该总是处理连接(如第一种模式,不是是Visual Studio建议的那种),然后根据新要求或性能相关转移到其他模式的问题。

我在Visual Studio建议的选项中看到的最大问题是,您无法控制DbConncetion对象的生命周期,并将其留给垃圾收集器以最终处理它。这可能会使连接资源在相当不确定的时间段内使用。