gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:52:48 24 4
gpt4 key购买 nike

这是我的第一个问题,我知道我应该在提问之前进行搜索,我确信我已经进行了搜索,但没有找到合适的信息。

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

[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 出现以下异常:

An unhandled exception of type 'System.NullReferenceException' occurred in EntityFramework.dll Additional information: Object reference not set to an instance of an object

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

An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in EntityFramework.dll Additional information: Login failed for user '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

除了你应该知道的任何事情之外,每个单一上下文是否有多个数据库是个好主意,this issue discussed before here .

希望这个回答对你有帮助。

关于c# - 一个 DbContext 和多个数据库,EF 代码优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50794237/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com