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





В двух словах - ДА. Базовая МОДЕЛЬ - это просто классовое представление таблиц вашей базы данных, поэтому хитрость здесь состоит в том, чтобы установить соединение с помощью другого драйвера базы данных, представленного 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 вместо атрибутов в ваших классах сущностей. Таким образом, вы можете повторно использовать одни и те же классы сущностей, давая им разные имена столбцов, длину строк, точность до десятичной дроби и т. д.
да. Но если это Code-First, вы, конечно, включите миграцию или инициализацию базы данных только для одного из них. У вас даже может быть мастер DbContext, в котором есть все ваши сущности, которые вы используете только для миграций.