我目前正在执行一项复杂的迁移任务,其中每次迭代都必须包装在一个事务中,以防失败。每次迭代最多可能需要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首次尝试使用上下文时会出现异常。
答案 0 :(得分:0)
您的帖子中有一件不清楚的东西是什么?编码优先还是Db优先?但是,您应该在所有事务发生后处置DbContext资源,并在您的DbConetext构造函数中明确实现这一行代码
public partial class RDSS_WBEntities : DbContext
{
public RDSS_WBEntities() : base("name=RDSS_WBEntities")
{
this.Database.CommandTimeout = int.MaxValue;
}
}