0

Правильно ли объявлять глобальную переменную «DBContext» в контроллере, а затем использовать ее для всех операций с базой данных?Объявление DbContext - Framework 4.1 - MVC 3.0

Пример:

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

}

Пожалуйста Advice,

+2

Возможный дубликат [Инициирование контекста в LINQ to Entities] (http: // stackoverflow. ком/вопросы/813457/инстанцировании-а-контекст-в-LINQ к лицам). Управление жизненным циклом DbContext было [обсуждено] (http://stackoverflow.com/questions/6334592/one-dbcontext-per-request-in-asp-net-mvc-without-ioc-container) много раз [уже ] (http://stackoverflow.com/questions/6987908/what-is-the-best-way-to-instantiate-and-dispose-dbcontext-in-mvc). –

ответ

1

Я попытался взвесить это вверх несколько раз. Я пришел к выводу, что это должно быть хорошо в большинстве ситуаций. Это «почему», я думаю, все должно быть хорошо.

Все советы предлагают сохранить контекст открытым как можно меньше времени, чтобы избежать загрузки и хранения трёх объектов. Это привело бы вас к мысли, что контекст должен быть создан и удален в каждом методе, а не глобально в классе.

Поскольку продолжительность HTTP-запроса невелика, наличие глобального контекста не должно быть значительным издержками, ресурсы, необходимые для создания контекста каждый раз, перевешивают преимущества сохранения его на время запроса ,

Этот ответ с точки зрения webforms, я не на 100%, если контроллер MVC будет поддерживаться дольше, чем запрос, и мне нужен другой ответ, которого я боюсь.

Я думаю, что ключ не должен устанавливать контекст как нечто статичное или что-то, что предназначено для жизни в течение всего времени приложения, так как это приведет вас к массовому потреблению памяти по мере роста количества объектов в памяти.

Вы можете утверждать, что явно не помещать что-то, что реализует IDisposable внутри блока использования, является плохой идеей, с которой я бы согласился.

(отказ от ответственности: параграф догадок!) Здесь я не уверен, что ресурсы остаются открытыми, если страница забивает исключение или подобное. Я думаю, что 99,9% времени вам будет хорошо, но могут быть редкие случаи, когда ресурс не удаляется правильно.

 Смежные вопросы

  • Нет связанных вопросов^_^