【发布时间】:2026-02-11 17:30:02
【问题描述】:
这是我的第一个问题,我知道在问任何问题之前我应该先搜索一下,我确定我已经搜索过了,但我没有找到合适的信息。
我正在使用代码优先的方法来实现我的上下文和模型, 所以我有一个简单的上下文,例如:
[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 来写入不同的数据库,例如:
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 和一个上下文)?
【问题讨论】:
-
因为提供者不同。
-
相当肯定 EF 一次在 [1context = 1database] 的前提下工作。
-
@Wurd,所以你说没有办法实现上述场景?
-
MySql db 的一个上下文和 SQL Server 的另一个上下文?另外,为什么一个上下文的类型是
SqlDBContext而另一个是MariaDBContext,但您只提供了MariaDBContext的实现?不同实例但相同类型的上下文在多个数据库上操作没有问题,前提是架构将匹配您的实体。 -
@VidmantasBlazevicius,我错过了,我刚刚编辑,我用
MultipleDbContext换了不同的ConnectionString
标签: c# entity-framework orm ef-code-first