繁体   English   中英

一个DbContext和多个数据库,EF代码优先

[英]One DbContext and multiple database, EF code first

这是我的第一个问题,我知道在搜索之前我应该​​搜索一下,我确信我已经完成了搜索,但是我找不到合适的信息。

我使用代码优先的方法来实现我的Context和我的模型,所以我有一个简单的上下文,如:

[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配置:

<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>

我想通过更改ConnectionString来写入不同的Db,如:

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得到以下异常:

EntityFramework.dll中发生未处理的“System.NullReferenceException”类型异常附加信息:对象引用未设置为对象的实例

但是,如果我删除DbConfigurationType装饰,那么第二个sqlContext工作正常第一个给出以下异常:

EntityFramework.dll中出现未处理的“System.Data.SqlClient.SqlException”类型异常附加信息:用户“root”登录失败。

我知道这是因为DbConfigurationType可以在应用程序中定义启动或在Context装饰或在配置文件中定义....

但我怎么能有这个(多个connectionstrings和一个上下文)?

我很确定这是因为配置文件中的配置(多个提供商),

据我所知,您应该在运行时为相关数据库更改提供程序。

因此,您的配置文件似乎是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 SupportThis

除了你应该知道的任何东西,这个好主意是每个单独的上下文有多个db, 这个问题在这里讨论过

希望这个答案可以帮到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM