Я використовую базовий контролер, який надає DataBase
властивість, до якої можуть отримати доступ похідні контролери.
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
Усі контролери в моїй програмі походять від BaseController
і використовуються таким чином:
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
Тепер, щоб відповісти на ваші запитання:
Коли мені робити новий DbContext / чи повинен я мати один глобальний контекст, який я передаю?
Контекст слід створювати за запитом. Створіть контекст, зробіть із ним все, що вам потрібно, а потім позбудьтеся. З рішенням базового класу, яке я використовую, вам слід лише турбуватися про використання контексту.
Не намагайтеся мати глобальний контекст (не так працюють веб-програми).
Чи можу я отримати один глобальний контекст, який я повторно використовую в усіх місцях?
Ні, якщо ви тримаєте контекст навколо, він буде відслідковувати всі оновлення, доповнення, видалення тощо, і це сповільнить роботу вашої програми і навіть може призвести до появи досить тонких помилок у вашій програмі.
Ймовірно, вам слід вибрати або виставити ваше сховище або ваш контекст на ваш контролер, але не обидва. Наявність у двох контекстах доступу з одного методу призведе до помилок, якщо вони обидва мають різні уявлення про поточний стан програми.
Особисто я віддаю перевагу викладати DbContext
безпосередньо, оскільки більшість прикладів сховищ, які я бачив, у DbContext
будь-якому випадку просто закінчуються тонкими обгортками .
Це спричиняє хіт продуктивності?
Перший час створення a DbContext
є досить дорогим, але як тільки це було зроблено, багато інформації кешується, щоб подальші екземпляри були набагато швидшими. Ви, швидше за все, побачите проблеми з продуктивністю утримання контексту навколо, ніж у випадку створення такого кожного разу, коли вам потрібен доступ до вашої бази даних.
Як це роблять усі інші?
Це залежить.
Деякі люди вважають за краще використовувати структуру введення залежностей, щоб передавати конкретний екземпляр свого контексту своєму контролеру при його створенні. Обидва варіанти чудово. Mine більше підходить для невеликих додатків, де ви знаєте, що конкретна база даних, що використовується, не зміниться.
деякі можуть стверджувати, що ви цього не можете знати, і саме тому спосіб введення залежностей кращий, оскільки це робить вашу програму більш стійкою до змін. На мою думку, це, мабуть, не зміниться (SQL-сервер та Entity Framework навряд чи є неясними) і що мій час найкраще витрачаю на написання коду, який є специфічним для мого додатка.