Другой контекст базы данных для одной и той же модели EF (базы данных)? - PullRequest
0 голосов
/ 30 октября 2018

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

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Хотите другой класс 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.

0 голосов
/ 31 октября 2018

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

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

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

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

0 голосов
/ 30 октября 2018

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

EG: Реализуйте шаблон репозитория внутри класса и назовите его 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, но ничто не мешает вам реализовать другой репозиторий, который предоставляет другой контекст базы данных в зависимости от связанных драйверов БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...