0

在控制器中声明“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);
    }

}

请指教,

4

1 回答 1

1

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

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

由于 HTTP 请求的持续时间很短,因此具有全局可用的上下文不应该是主要开销,每次创建上下文所需的资源将超过在请求期间保持其打开的好处。

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

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

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

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

于 2012-05-10T13:05:55.220 回答