GOOGLE ADS

четверг, 28 апреля 2022 г.

Когда я должен создать новый DbContext()

В настоящее время я использую DbContextаналогичный этому:

namespace Models
{
public class ContextDB: DbContext
{

public DbSet<User> Users { get; set; }
public DbSet<UserRole> UserRoles { get; set; }
public ContextDB()
{

}
}
}

Затем я использую следующую строку в верхней части ВСЕХ моих контроллеров, которым требуется доступ к базе данных. Я также использую его в своем классе UserRepository, который содержит все методы, относящиеся к пользователю (например, получение активного пользователя, проверка его ролей и т. д.):

ContextDB _db = new ContextDB();

Размышляя об этом, бывают случаи, когда один посетитель может иметь несколько активных DbContexts, например, если он посещает контроллер, использующий UserRepository, что может быть не самой лучшей идеей.

Когда я должен создать новый DbContext? В качестве альтернативы, должен ли я иметь один глобальный контекст, который передается и повторно используется во всех местах? Может ли это привести к снижению производительности? Предложения альтернативных способов сделать это также приветствуются.


Решение проблемы

Я использую базовый контроллер, который предоставляет 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

Приводит ли это к снижению производительности?

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

Как все остальные это делают?

Это зависит.

Некоторые люди предпочитают использовать инфраструктуру внедрения зависимостей для передачи конкретного экземпляра своего контекста своему контроллеру при его создании. Оба варианта хороши. Мой больше подходит для небольшого приложения, где вы знаете, что конкретная используемая база данных не изменится.

некоторые могут утверждать, что вы не можете этого знать, и именно поэтому метод внедрения зависимостей лучше, поскольку он делает ваше приложение более устойчивым к изменениям. Я считаю, что это, вероятно, не изменится (сервер SQL и Entity Framework едва ли неясны) и что мое время лучше всего потратить на написание кода, специфичного для моего приложения.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...