Другой контекст базы данных для той же модели EF (базы данных)?

Можно ли добавить другой контекст базы данных для той же модели EF (базы данных)? У меня есть ситуация, когда контекст db должен измениться, в зависимости от того, какой пользователь вошел в систему.

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

David Browne - Microsoft 30.10.2018 13:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
520
3

Ответы 3

В двух словах - ДА. Базовая МОДЕЛЬ - это просто классовое представление таблиц вашей базы данных, поэтому хитрость здесь состоит в том, чтобы установить соединение с помощью другого драйвера базы данных, представленного Entity Framework.

НАПРИМЕР: Реализуйте шаблон репозитория внутри класса и назовите его MySqlContext, где этот класс наследуется от DbContext, и у него будет метод OnConfiguring:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        using (var secretsClient = new InsightSecrets())
        {
            var connectionInfo = // here you add your own depending on environment and project
            string connectionString = connectionInfo.ConnectionString;

            optionsBuilder.UseMySql(connectionString);
        }
    }

Экземпляр optionsBuilder может затем создать в этом случае выше, либо ссылку MySql, либо ссылку Postgress - в то время как этот репозиторий затем будет создан выше в вашем коде, выполнив что-то вроде этого внутри конструктора класса, где будет использоваться этот контекст:

var ctx = new MySqlContext();

Репозиторий MySqlContext в этом примере может уже предоставлять MySql или Postgres, но ничто не мешает вам реализовать другой репозиторий, который предоставляет другой контекст базы данных в зависимости от связанных драйверов db.

Вы хотите другой класс DbContext или просто другую базу данных? Класс DbContext - это мост между базой данных и вашими объектами (модель EF). Этот мост можно использовать для передачи данных из / в разные базы данных. Создание другого класса DbContext для той же модели EF не имеет для меня особого смысла; если я чего-то не упускаю ...

Но вы можете сделать и то, и другое. Если вы ищете другое подключение к базе данных, тогда это будет ваш класс DbContext, ваш "мост":

public class TestContext : DbContext
{
    public DbSet<Foo> Foos { get; set; }
    public DbSet<AnotherFoo> AFoos { get; set; }

    public TestContext() : this("TestDB1") { }

    public TestContext(string databaseName)
        : base(databaseName)
    {
        Configuration.LazyLoadingEnabled = true;
    }
}

DbContext устанавливает соединение с базой данных, предоставляя имя базы данных в базовом конструкторе. Таким образом, вы можете управлять базой данных, к которой он подключается, через конструктор.

Строки подключения к базам данных, конечно же, должны быть объявлены в файле .config. Например:

<connectionStrings>
  <add name = "TestDBContext1" connectionString = "Data Source=.\SQLEXPRESS; Initial Catalog=TestDB1; persist security info=True; user id=sa; password=saexpress;" providerName = "System.Data.SqlClient" />
  <add name = "TestDBContext2" connectionString = "Data Source=.\SQLEXPRESS; Initial Catalog=TestDB2; persist security info=True; user id=sa; password=saexpress;" providerName = "System.Data.SqlClient" />
</connectionStrings>

Однако я бы посоветовал не использовать конструкторы напрямую, а использовать заводской шаблон проектирования для создания соответствующих экземпляров DbContext.

В Entity Framework класс DbContext представляет определенный макет базы данных. DbSet<TEntity> в DbContext представляют таблицы в этой базе данных; невиртуальные свойства TEntity представляют столбцы таблицы, а виртуальные свойства TEntity представляют отношения между таблицами (один-ко-многим, многие-ко-многим, ...)

Если вам нужен другой экземпляр базы данных с точно такой же компоновкой, достаточно создать другой экземпляр базы данных с другим «NameOrConnectionString» в качестве входного параметра в конструкторе.

Если вам нужна очень похожая база данных, в которой вы хотите повторно использовать некоторые таблицы и отношения из другой базы данных, вам следует создать другой класс DbContext; в конце концов: класс DbContext представляет макет вашей базы данных, а другой макет означает другой DbContext.

Может случиться так, что во втором DbContext вам также понадобятся другие отношения, с разной длиной строки, разными именами таблиц и т. д., Чем значения структуры сущности по умолчанию. В этом случае лучше использовать Fluent API в вашем DbContext.OnModelCreating вместо атрибутов в ваших классах сущностей. Таким образом, вы можете повторно использовать одни и те же классы сущностей, давая им разные имена столбцов, длину строк, точность до десятичной дроби и т. д.

Другие вопросы по теме