День 1503. #ЗаметкиНаПолях
Использование Нескольких Контекстов EF Core. Начало
EF Core использует DbContext, который представляет сеанс с БД и отвечает за отслеживание изменений, выполнение операций и управление подключениями. Обычно в приложении используется только один DbContext. Но что, если нужно иметь несколько?
Зачем?
1. Несколько баз данных. Вы вынуждены использовать несколько контекстов, каждый из которых предназначен для своей БД.
2. Разделение проблем. Если модель предметной области сложная, можно упростить себе жизнь, разделив задачи между несколькими контекстами, каждый из которых отвечает за определённую часть.
3. Модульный монолит. Вы можете настроить свою схему базы данных для каждого контекста, обеспечивая логическое разделение на уровне базы данных.
4. Экземпляр для чтения. Вы можете настроить отдельный экземпляр DbContext только для чтения из БД, например, установив QueryTrackingBehavior.NoTracking на уровне DbContext, чтобы повысить производительность запросов.
Рассмотрим пример с двумя контекстами:
- оба используют одну и ту же БД,
- каждый обращается к отдельной схеме.
public class CatalogDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
}
public class OrderDbContext : DbContext
{
public DbSet<Order> Orders { get; set; }
public DbSet<LineItem> LineItems { get; set; }
}
Сначала нам нужно добавить контексты в контейнер DI:
services.AddDbContext<CatalogDbContext>(opt =>
opt.UseSqlServer("CONNECTION_STRING"));
services.AddDbContext<OrderDbContext>(opt =>
opt.UseSqlServer("CONNECTION_STRING"));
Если вы просто хотите использовать оба контекста в одной схеме, то это всё. Если вы хотите настроить разные схемы для каждого, необходимо переопределить метод OnModelCreating и указать схему с помощью HasDefaultSchema:
public class CatalogDbContext : DbContext
{
…
protected override void
OnModelCreating(ModelBuilder mb)
{
mb.HasDefaultSchema("catalog");
}
}
public class OrderDbContext : DbContext
{
…
protected override void
OnModelCreating(ModelBuilder mb)
{
mb.HasDefaultSchema("order");
}
}
Окончание следует…
Источник: https://www.milanjovanovic.tech/blog/using-multiple-ef-core-dbcontext-in-single-application