我正在使用EF6
与MySql
数据库进行一些非常简单的集成。
执行以下操作后发生Nested transactions are not supported.
错误:
key
...导致错误:Duplicate entry 'asdf' for key 'UserName_UNIQUE'
Nested transactions are not supported.
我想我不确定关于这两个查询的Nested
是什么......我做错了什么:
对于某些代码
using (var db = C2SCore.BuildDatabaseContext())
{
db.Users.Add(new UserProfile { UserName = UserName, Password = Password });
db.SaveChanges(); // <- Errors occur here...
}
对于我添加的每个UserProfile
,此代码段运行(正如我上面描述的流程所示)。
答案 0 :(得分:6)
我有完全相同的问题。 通过将其包装到TransactionScope中尝试以下解决方法:
using System.Transactions; // Add assembly in references
using (var db = C2SCore.BuildDatabaseContext())
{
using (var tran = new TransactionScope())
{
db.Users.Add(new UserProfile { UserName = UserName, Password = Password });
db.SaveChanges(); // <- Should work now after first exception
tran.Complete();
}
}
<package id="MySql.Data" version="6.8.3" targetFramework="net45" />
<package id="MySql.Data.Entities" version="6.8.3.0" targetFramework="net45" />
但是,他们知道这一点:http://bugs.mysql.com/bug.php?id=71502
答案 1 :(得分:3)
我只是想重申“他们已经意识到这一点”但是如果没有人注册并碰到线程,那么当这是一个紧急问题时,可能需要更长时间才能解决。
答案 2 :(得分:1)
尝试在开头添加db.Connection.Open()
,在结尾添加db.Connection.Close()
。
答案 3 :(得分:1)
看到它现在是如何2017年,这个问题仍然存在我将发布我能够找到的唯一的解决方法,不涉及拉动源代码。将ConnectionReset = True添加到连接字符串将解决该问题。应该注意的是,对于连接池中使用的每个连接,这将导致数据库的额外往返。
以下是一个示例:server=localhost;port=3306;database=somedatabase;uid=someuser;password=itsasecret;ConnectionReset=True;
答案 4 :(得分:0)
然后,该错误表示您需要在出现第一个错误后处理该事务,然后才能继续执行其他操作。我建议放置try ... catch
并在finally
块中处理当前事务。
您甚至可能必须处理当前的Connection
,但我会先尝试处理这些交易。
答案 5 :(得分:0)
我在这里发布我的答案,因为这个帖子是googling时的第一个结果&#34;不支持实体框架嵌套交易&#34;希望它能帮助某人:
对我来说,在MySQL DB,longtext字段中尝试保存非法字符(希伯来字符)时出现此问题
答案 6 :(得分:0)
对于我来说,带有Entity Framework的客户端应用程序无法连接到Internet上托管在服务器上的MySql数据库。从互联网连接中删除proxy
后,问题已解决。
答案 7 :(得分:0)
我在Oracle的MySQL.Data提供程序版本6.7.9中遇到了相同的错误。
该数据库的自动提交功能已关闭,在从DataSet保存更改之前必须使用事务(对DataAdapter.Update的调用)-使用相同模式但启用了自动提交的其他数据库没有必要
仅使用保存事务使用DevArt的dotConnect.Express.for.MySQL驱动程序(版本8.16.1541),而不使用Oracle的驱动程序。
看起来就像使用Oracle的驱动程序一样,即使选择进行访问数据库也会创建某种默认事务。
因此,在对数据库的每个读取访问使用事务后(DataAdapter.Fill),我最终可以使用Oracle的驱动程序。