Entity Framework 6 теряет соединение при длительной транзакции - PullRequest
0 голосов
/ 23 января 2019

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

В основном это было успешно.В некоторых случаях между доступами к соединению требуется длительная операция.

По существу, соединение некоторое время не используется (> 10 минут), и когда я пытаюсь использовать соединение снова, я обнаруживаю, что оносломано:

System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: The connection is broken and recovery is not possible.  The connection is marked by the server as unrecoverable.  No attempt was made to restore the connection.
   at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__180_0(Task`1 result)
   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()

Код выглядит примерно так:

// Context = instance of DbContext
using (var dbContextTransaction = Context.Database.BeginTransaction())
{
    DoStuffWithContext(Context);

    PotentiallyLongOperationWithoutContext();

    DoMoreStuffWithContext(Context);
}

Обычно это все работает нормально, но когда PotentiallyLongOperationWithoutContext действительно занимает много времени, я получаю исключение, когда DoMoreStuffWithContext сначала пытается использоватьконтекст.

1 Ответ

0 голосов
/ 01 февраля 2019

Из вашего поста непонятно, что вы используете?Сначала код или Db первый?Однако вы должны утилизировать ресурсы DbContext после всех транзакций и обязательно реализовать эту строку кода в конструкторе DbConetext

 public partial class RDSS_WBEntities : DbContext
    {
        public RDSS_WBEntities() : base("name=RDSS_WBEntities")
        {
            this.Database.CommandTimeout = int.MaxValue;
        }
    }
...