2014-01-29 57 views
9

我正在使用EF6MySql数据库做一些非常简单的整合。发生如何避免“不支持嵌套事务”。错误?

Nested transactions are not supported.错误后,我做到以下几点:

  1. 尝试添加已经存在......这就给错误导致一个keyDuplicate entry 'asdf' for key 'UserName_UNIQUE'
  2. 尝试之后添加任何东西...这导致错误: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

重复'key'代码在哪里? – rae1

+0

@ rae1'UserName'是'key' ...如果这就是你要求的。 – Andrew

+0

如果明确打开一个包装TransactionScope会发生什么?并且没有从其他地方打开的背景,是吗? – user2864740

回答

0

该错误表明您需要在出现第一个错误后处置该事务,然后才能继续执行其他操作。我会建议将try ... catch并在finally区块中处理当前交易。

您甚至可能不得不处置当前的Connection,但我会尝试先处理交易。

+0

上下文对象周围有一个'using',所提供的代码并不表示任何上下文泄漏。 – user2864740

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

+0

这是我找到的唯一解决方法,谢谢。它确实需要对代码进行很多更改,但每个使用'DbContext.SaveChanges()'的操作都必须包装在'TransactionScope'中。如果你的应用程序只有一些这些,可能会有用。 – AronVanAmmers

+0

更正:这对我不起作用。异常不会发生,但数据不会保存到数据库。 – AronVanAmmers

1

尝试添加db.Connection.Open()开始和db.Connection.Close()底。

0

我在这里张贴我的答案,因为这线程是第一结果谷歌搜索“实体框架嵌套事务,不支持”的时候,希望这将帮助别人:

对于我来说,这个问题尝试在MySQL数据库中保存非法字符(希伯来字符)时出现,longtext字段

1

看到它是如何到2017年,这个问题仍然存在我将发布唯一的解决方法,我已经能够发现,不涉及拉取源代码。将ConnectionReset = True添加到连接字符串将解决问题。应该注意的是,这将导致连接池中使用的每个连接的额外往返数据库。

下面是一个示例:server=localhost;port=3306;database=somedatabase;uid=someuser;password=itsasecret;ConnectionReset=True;