【问题标题】:DbContext declaration - Framework 4.1 - MVC 3.0DbContext 声明 - 框架 4.1 - MVC 3.0
【发布时间】:2012-05-10 12:55:53
【问题描述】:

在控制器中声明“DBContext”的全局变量,然后用于所有数据库操作是否正确?

例子:

public class ProductController : Controller
{
    private readonly DBContextEntities _db = new DBContextEntities();

    public ActionResult Index()
    {
     var products = _db.Products.ToList();
     return View(products);
    }

    public ActionResult Create()
    {
     _db.Products.AddObject(new Product{Name="x",Price="5.2"});
     _db.SaveChanges();
     return View(products);
    }

}

请指教,

【问题讨论】:

标签: asp.net-mvc-3 controller entity-framework-4.1 ado.net-entity-data-model dbcontext


【解决方案1】:

我已经尝试过几次权衡。我得出的结论是,在大多数情况下应该没问题。这就是我认为应该没问题的“原因”。

所有建议都建议尽可能短地保持上下文打开,这是为了避免大量实体被加载并保存在内存中。 这会导致您认为应该在每个方法中创建和处置上下文,而不是在一个类中全局。

由于 HTTP 请求的持续时间很短,因此在全球范围内提供上下文不应该是主要开销,每次创建上下文所需的资源将超过在请求期间保持打开上下文的好处。

这个答案是从网络表单的角度来看的,如果 MVC 控制器的存活时间比请求长,并且恐怕需要不同的响应,我不是 100%。

我认为关键是不要将上下文设置为任何静态的东西,或者在应用程序期间一直存在的东西,因为随着内存中实体数量的增长,这将导致您消耗大量内存。

您可能会争辩说,不明确地将实现 IDisposable 的东西放在 using 块中是一个坏主意,我同意这一点。

(免责声明:猜测段落!) 如果页面出现异常或类似情况,我不确定资源是否会保持打开状态。我认为 99.9% 的情况下你会没事的,但在极少数情况下资源没有被正确处理

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多