2014-01-29 92 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;