2014-01-29 3 views
9

Я использую EF6, чтобы сделать довольно простой интеграцию с базой данных MySql.Как избежать «Вложенные транзакции не поддерживаются». ошибка?

Ошибка Nested transactions are not supported. происходит после того, как я делаю следующее:

  1. Попытка добавить key, что уже существует ... Что приводит к ошибке: Duplicate entry 'asdf' for key 'UserName_UNIQUE'
  2. Попытка добавить что-нибудь потом ... Which приводит к ошибке: 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' является' ключ' ... Если это то, о чем вы просите. – Andrew

+0

Что произойдет, если явным образом откроется пакет TransactionScope? И нет контекста, открытого от * в другом месте *, есть ли? – user2864740

ответ

0

Ошибка указывает на необходимость удаления транзакции после возникновения первой ошибки, прежде чем вы сможете продолжить другие операции. Я бы предложил разместить try ... catch и распоряжаться текущей транзакцией в блоке finally.

Возможно, вам даже придется избавиться от текущего Connection, но я бы попробовал разобраться с транзакциями в первую очередь.

+0

Существует «использование» вокруг объекта контекста, и предоставленный код не указывает на утечку контекста. – 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() в конце.

3

Пожалуйста, я просто хочу повторить «они знают об этом», но без людей, подписывающих и ударяющих по нити, скорее всего, это займет больше времени, чтобы решить, когда это срочная проблема.

http://bugs.mysql.com/bug.php?id=71502

0

Я отправляю мой ответ здесь, так как этой теме является первым результатом, когда прибегая к помощи «рамочные сущность вложенные транзакции не поддерживаются», мы надеемся, это поможет кому-то:

Для меня этот вопрос появилось при попытке сохранить незаконные символы (символы на иврите) в MySQL DB, поле longtext

1

Посмотрите, как сейчас 2017 год, и эта проблема все еще существует. Я собираюсь опубликовать единственное обходное решение, которое я смог найти, привлекать вытягивание исходного кода. Добавление ConnectionReset = True в строку подключения решит проблему. Следует отметить, что для каждого подключения, используемого в пуле подключений, потребуется дополнительная обратная поездка в базу данных.

Вот пример: server=localhost;port=3306;database=somedatabase;uid=someuser;password=itsasecret;ConnectionReset=True;

Смежные вопросы