【发布时间】:2015-03-02 09:57:12
【问题描述】:
我对一个项目有以下要求:使用EntityFramework在MySql中的多个数据库上执行事务(所有数据库都在同一个mysql服务器上)。
在尝试使用 TransactionScope 解决问题时,似乎存在不同 MySql 连接字符串的问题:
“当前不支持多个同时连接或同一事务内具有不同连接字符串的连接。”
这里已经描述了这个问题(没有任何具体的解决方案): How do I use TransactionScope with MySql and Entity Framework? (getting Multiple simultaneous connections...are not currently supported error)
作为一种解决方法,我尝试从连接字符串中省略数据库参数,如果我在调用 .SaveChanges() 方法之前打开连接并设置数据库(通过在从 DbContext 继承的类中重载该方法),则该方法有效.但是为每个 select 语句调用相同的语句是不可行的。
我的自定义类如下所示:
public class ContextBase : DbContext
{
public ContextBase(string connectionStringWithoutDatabase)
: base(connectionStringWithoutDatabase)
{}
public override int SaveChanges()
{
Database.Connection.Open();
Database.Connection.ChangeDatabase("MyDatabaseName");
base.SaveChanges();
Database.Connection.Close();
}
// How to handle Selects?
}
我的工作单元类:
public class UnitOfWork
{
private IEnumerable<DbContext> ContextList
{
get { return _contextList; }
}
private readonly IEnumerable<DbContext> _contextList;
public UnitOfWork(IEnumerable<DbContext> contextList)
{
_contextList = contextList;
}
public void Save()
{
var transactionScope = new TransactionScope();
foreach (DbContext context in ContextList)
{
context.SaveChanges();
}
transactionScope.Complete();
transactionScope.Dispose();
}
}
另一种可能的解决方法是创建一个包装器,其中有两个 DbContext 实例 - 一个为 select 语句设置数据库,另一个不用于非查询操作。但这感觉不对。
现在我的问题:
有没有更简单的方法来进行此类交易?
是否可以在 select 语句发生之前设置数据库名称?在构造函数中打开连接可行吗?
带有两个 DbContext 的包装器开销是否太大?
【问题讨论】:
标签: mysql .net transactions entity-framework-6