Один DbContext и несколько баз данных, сначала код EF - PullRequest
0 голосов
/ 11 июня 2018

Это мой первый вопрос, и я знаю, что должен искать, прежде чем что-то задавать, я уверен, что я выполнил поиск, но не нашел нужной информации.

Я использую подход, основанный на коде, чтобыреализовать мой контекст и мои модели, поэтому у меня есть простой контекст, как:

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public partial class MultipleContext : DbContext
{
    public MariaDBContext(string connection) : base(connection)
    {
        //Database.SetInitializer<MultipleDBContext>(new MariaDbInitializer());
    }
    public virtual DbSet<Test> Tests { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Test>().ToTable("test")
            .HasKey(e => e.ID);
    }
}

и моя модель:

public partial class Test
{
    public int ID { get; set; }

    public string Name { get; set; }

    public string Family { get; set; }
}

, и у меня есть два connectionstrings, как показано ниже:

<connectionStrings> 
    <add name="MariaDBContext" connectionString="server=127.0.0.1;user id=root;password=xx;database=sb1" providerName="MySql.Data.MySqlClient" />
    <add name="SqlDBContext" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=db1" providerName="System.Data.SqlClient" />
  </connectionStrings>

и мой EF config:

<entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
            <parameters>
                <parameter value="mssqllocaldb" />
            </parameters>
        </defaultConnectionFactory>
        <providers>
            <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
        </providers>
    </entityFramework>

Я хочу записать в другой Db, просто изменив ConnectionString, например:

MultipleDBContext context = new MultipleDBContext(System.Configuration.ConfigurationManager.ConnectionStrings["MariaDBContext"].ToString());
var xx = context.Tests.Where(x => x.ID > 0).ToList();
context.Tests.Add(new Test()
{
    Name = "name",
    Family = ""
});
context.SaveChanges();
xx = context.Tests.Where(x => x.ID > 0).ToList();
//Use sql connection

MultipleDBContext sqlContext = new MultipleDBContext (System.Configuration.ConfigurationManager.ConnectionStrings["SqlDBContext"].ToString());
var sqlTest = sqlContext.Tests.Where(x => x.ID > 0).ToList();
sqlContext.Tests.Add(new Test()
{
    Name = "name_" + DateTime.Now.Ticks.ToString(),
    Family = "family_" + DateTime.Now.Ticks.ToString(),
});
sqlContext.SaveChanges();
sqlTest = sqlContext.Tests.Where(x => x.ID > 0).ToList();

, первые context работаютхорошо, но sqlcontext получает следующее исключение:

Произошло необработанное исключение типа 'System.NullReferenceException' в EntityFramework.dll Дополнительная информация: ссылка на объект не установлена ​​для экземпляра объекта

, но если я удаляю украшение DbConfigurationType, то второе sqlContext работает нормально, первое дает следующее исключение:

Необработанное исключение типа 'System.Data.SqlClient.SqlException 'произошло в EntityFramework.dll Дополнительная информация: Ошибка входа для пользователя 'root'.

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

но как я могу получить это (несколько connectionstrings и один контекст)?

1 Ответ

0 голосов
/ 11 июня 2018

Я почти уверен, что это из-за конфигурации в конфигурационном файле (несколько провайдеров),

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

Итакпоскольку ваш файл конфигурации настроен для MySql провайдера:

 <providers>
    <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
 </providers>

, поэтому вы должны определить провайдера для connectionstring, как показано ниже (только для примера):

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
</providers>

, ноПриведенный выше конфиг проблема не исчезнет, ​​потому что для этого есть некоторые другие советы и рекомендации, такие как различные schema в другой базе данных, различные атрибуты, такие как [DbColumn(msSqlName: "Id", oracleName: "ID", postgreSqlName: "id")] и т. д.

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

первая - Поддержка Entity Framework Multi DB и Это

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

Надеюсь, этот ответ поможет вам.

...