在我们的应用程序中使用Entity Framework几年后,我们公司已开始向用户部署笔记本电脑。笔记本电脑正在现场使用,可直接连接到我们的网络。
从那时起,我们看到我们程序中的崩溃大量增加,异常日志显示
System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server.
(provider: Session Provider, error: 19 - Physical connection is not usable)
我的理论是,这个问题源于这样一个事实,即与PC不同,笔记本电脑会进入睡眠状态。我认为当笔记本电脑进入休眠状态时,网络适配器被禁用,并在重新启动时重新启用。我认为我们的程序仍在尝试使用不再存在的连接与服务器通信。
所以,我的想法是回应:
Microsoft.Win32.SystemEvents.PowerModeChanged
我可以检测到它什么时候醒来并刷新连接。麻烦的是,我似乎唯一能做的就是处理当前的DbContext并实例化一个新的。
这样做的问题是任何未提交的更改都会丢失。如果用户整天都在更新记录,他们就会失去工作。不仅如此,我们还必须完成所有应用程序和所有视图模型,并在编辑模式中添加一些带有通知的用户。根本不漂亮。
我的第二个想法是创建一个克隆DbContext的方法。当计算机醒来时,我可以创建一个新的DbContext并在处理之前复制旧的DbContext ...但是我们的一些数据模型非常庞大,并且为每个模型创建深度克隆方法将是一项艰巨的任务。
我发现这可能仍然是我们必须采取的方式......但是我不会检查是否有人知道如何刷新Entity Framework DbContext的连接而不会丢失它的当前状态
我很感激任何人可能有的建议。
答案 0 :(得分:3)
我不确定,它是否会对您的具体情况有所帮助,但您可以检查DbConetxt
类使用的连接的状态,并最终重新打开它。
if(context.Database.Connection.State == ConnectionState.Closed) {
context.Database.Connection.Open();
}
它也可以将连接传递给它的构造函数中的DbContext
并手动管理此连接。
var conn = new SqlConnection("{connectionString}"));
var context = new DbContext(conn, contextOwnsConnection: false);
...
if(conn.State == ConnectionState.Closed) {
conn.Open();
}
context.SaveChanges();
...
context.Dispose();
conn.Dispose();
如果您想在EF 5或更早版本的Versios中使用此代码,则存在一些限制。见official documentation.
答案 1 :(得分:0)
我只是要评论,但我没有足够的声誉点来做到这一点,所以无论如何我想知道是否有可能在与Entity Framework的断开状态下工作?也许以下链接中的文章可以提供帮助: