C# 当连接丢失时,如何将实体框架连接重新连接到数据库

C# 当连接丢失时,如何将实体框架连接重新连接到数据库,c#,.net,sql,entity-framework,mvvm,C#,.net,Sql,Entity Framework,Mvvm,我正在使用实体框架5.0进行一个MVVM项目 我连接到托管数据库,有时实体框架会断开与数据库的连接 当连接丢失时,将连接重新连接到数据库的最佳方法是什么?当在保存更改时连接断开时,您只会遇到异常。整个保存在由于异常而未提交的事务中完成,EF不会将其当前更改集标记为已完成。您只需在发生特定异常时再次尝试保存更改-EF将尝试打开新连接并执行相同的事务 例如: 嗯,也许是这样的: public virtual void SubmitChanges() { if (DataContext !=

我正在使用实体框架
5.0
进行一个
MVVM
项目

我连接到托管数据库,有时实体框架会断开与数据库的连接


当连接丢失时,将连接重新连接到数据库的最佳方法是什么?

当在保存更改时连接断开时,您只会遇到异常。整个保存在由于异常而未提交的事务中完成,EF不会将其当前更改集标记为已完成。您只需在发生特定异常时再次尝试保存更改-EF将尝试打开新连接并执行相同的事务


例如: 嗯,也许是这样的:

public virtual void SubmitChanges()
{
    if (DataContext != null)
    {               
        try
        {
             DataContext.SubmitChanges();
        }
        catch (Exception whenILostMyConnection)
        {
             SubmitChanges(); //recall the sumbitChanges
        }
    }             
}

您可以在WindowsAzure源代码中看到答案。Azure CRUD操作通常会将它们放入循环中,重复多次执行相同的操作会导致某些特定的异常。但你必须非常小心,例外情况是,你知道重试的处理方式在大多数情况下会使你的应用程序变慢。

好的,听起来不错,但是当我在ViewModel中,它尝试执行LINQ查询,但由于连接关闭或断开而失败时,我该怎么办?我已经注册了一个事件,该事件在连接状态更改时触发,而在我断开与数据库的连接时似乎不会触发。那么我该如何处理这个问题呢?我不是很擅长提供“好”的设计模式解决方案,但我认为如果你集中你的数据库操作方法,这样你就可以很容易地根据数据库管理你的事务,例如,创建一些数据操纵器类,它管理简单的操作,如SaveChanges、Commit等。如果连接持续失败,这不是一个无限循环吗?这是一个基本的想法,为了决定是否继续,您必须处理特定的异常