gpt4 book ai didi

mysql - 使用 EntityFramework 6 和 MySql 的 TransactionScope

转载 作者:行者123 更新时间:2023-11-29 07:41:59 26 4
gpt4 key购买 nike

我对一个项目有以下要求:使用EntityFramework在MySql中的多个数据库上执行事务(所有数据库都在同一个mysql服务器上)。

当尝试使用 TransactionScope 解决问题时,不同的 MySql 连接字符串似乎存在问题:

"Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported."

这里已经描述了这个问题(没有任何具体的解决方案): 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?
}

我的工作单元类(class):

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 语句发生之前设置数据库名称?在构造函数中打开连接是否可行?

  • 具有两个 DbContext 的包装器开销会太大吗?

最佳答案

我尝试使用 Devart 库。这个对我有用。下面是我运行的代码。

不工作 - MySql.Data.MySqlClient.MySqlConnection

using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope(TransactionScopeOption.Required))
{
MySql.Data.MySqlClient.MySqlConnection connect1 = new MySql.Data.MySqlClient.MySqlConnection("Server=192.168.0.1;Database=db1;Uid=root;Pwd=root;");
MySql.Data.MySqlClient.MySqlConnection connect2 = new MySql.Data.MySqlClient.MySqlConnection("Server=192.168.0.2;Database=db2;Uid=root;Pwd=root;");
connect1.Open();
connect2.Open();


var command1 = connect1.CreateCommand();
var command2 = connect2.CreateCommand();

command1.CommandText = "INSERT INTO test01(`Value`) VALUES(SYSDATE());";
command2.CommandText = "INSERT INTO test02(`Value`) VALUES(SYSDATE())";

command2.ExecuteNonQuery();
throw new Exception("bbbbbb");
command1.ExecuteNonQuery();

scope.Complete();
}

工作 - Devart.Data.MySql.MySqlConnection

using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope(TransactionScopeOption.Required))
{
Devart.Data.MySql.MySqlConnection connect1 = new Devart.Data.MySql.MySqlConnection("Server=192.168.0.1;Database=db1;Uid=root;Pwd=root;");
Devart.Data.MySql.MySqlConnection connect2 = new Devart.Data.MySql.MySqlConnection("Server=192.168.0.2;Database=db2;Uid=root;Pwd=root;");
connect1.Open();
connect2.Open();


var command1 = connect1.CreateCommand();
var command2 = connect2.CreateCommand();

command1.CommandText = "INSERT INTO test01(`Value`) VALUES(SYSDATE());";
command2.CommandText = "INSERT INTO test02(`Value`) VALUES(SYSDATE())";

command2.ExecuteNonQuery();
throw new Exception("bbbbbb");
command1.ExecuteNonQuery();

scope.Complete();
}

关于mysql - 使用 EntityFramework 6 和 MySql 的 TransactionScope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28806875/

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