在我们的应用程序中使用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)
我的理论是,问题源于笔记本电脑与个人电脑不同之处在于其会进入睡眠状态。我认为,当笔记本电脑进入睡眠状态时,网络适配器被禁用,而当它重新唤醒时,则被重新启用。我认为我们的程序仍然试图使用不存在的连接与服务器通信。
因此,我的想法是:
Microsoft.Win32.SystemEvents.PowerModeChanged
我可以检测到它的唤醒并刷新连接。问题是,我似乎唯一能做到这一点的方式是处理当前的 DbContext 并实例化一个新的。
这样做的问题是任何未提交的更改都将丢失。如果用户一整天都在更新记录,他们就会丢失工作。不仅如此,我们还必须遍历所有应用程序和视图模型,并纳入某种退出编辑模式的通知给用户。非常不美观。
我想到的第二个想法是创建一个克隆 DbContext 的方法。当计算机唤醒时,我可以创建一个新的 DbContext 并从旧的 DbContext 复制状态,然后释放旧的...但我们的一些数据模型非常庞大,为每个模型创建一个深度克隆方法将是相当艰巨的任务。
我认为这可能仍然是我们必须采取的方式...但如果有人知道在不丢失当前状态的情况下刷新 Entity Framework DbContext 连接的方式,我会很愚蠢不去尝试的。
我将感激任何人的建议。