实体框架6因长期交易而失去连接

时间:2019-01-23 17:09:28

标签: c# sql-server entity-framework entity-framework-6

我目前正在执行一项复杂的迁移任务,其中每次迭代都必须包装在一个事务中,以防失败。每次迭代最多可能需要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 :(得分:0)

您的帖子中有一件不清楚的东西是什么?编码优先还是Db优先?但是,您应该在所有事务发生后处置DbContext资源,并在您的DbConetext构造函数中明确实现这一行代码

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