ASP.NET实体框架DataContext使用问题

ASP.NET实体框架DataContext使用问题,asp.net,entity-framework,datacontext,Asp.net,Entity Framework,Datacontext,我已经用EF建立了一个ASP.NET网站。我创建了一个DataContext类,它实现了singleton模式。我的DAO类(也包括单例)实例化此datacontext并将其存储在属性中。他们使用它来查询SQLServer数据库。这在3个月内运行正常,但我突然收到异常消息,如:“连接必须有效且已打开/连接已打开”。似乎没有处理datacontext。据我说,唯一的变化是数据大小和用户数量的增加 然后我发现有多篇帖子说singleton对datacontext是个坏主意,所以我尝试在每个请求中用u

我已经用EF建立了一个ASP.NET网站。我创建了一个DataContext类,它实现了singleton模式。我的DAO类(也包括单例)实例化此datacontext并将其存储在属性中。他们使用它来查询SQLServer数据库。这在3个月内运行正常,但我突然收到异常消息,如:“连接必须有效且已打开/连接已打开”。似乎没有处理datacontext。据我说,唯一的变化是数据大小和用户数量的增加

然后我发现有多篇帖子说singleton对datacontext是个坏主意,所以我尝试在每个请求中用using语句实例化datacontext,这就解决了问题,除了对数据库没有影响的更新查询。我必须将db对象附加到上下文,然后将其EntityState设置为“modified”,以使我的SaveChanges工作

像这样:

public bool DoucheXpsu(as_headers session) {
    using (MyDBEntities MyContext = new MyDBEntities()) {

        try {
            as_status status = GetStatus(session);
            if (status != null) {
                if (status.mainstatusvalue == 300) {
                    status.DateDoucheXpsu = DateTime.Now;
                    status.DoucheXpsu = 1;

                    MyContext.as_status.Attach(status);
                    MyContext.ObjectStateManager.ChangeObjectState(status, EntityState.Modified);

                    MyContext.SaveChanges();

                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } catch (OptimisticConcurrencyException) {
            return false;
        } catch (Exception) {
            return false;
        }
    }
}
问题是它实际上不适用于一种方法(与另一种更新方法没有什么不同)! 在我尝试附加对象时出现异常:“无法附加对象,因为它已在对象上下文中。对象只有在处于未更改状态时才能重新附加。”因此我必须对attach和ChangeObjectState方法进行注释,以使其按预期工作:

public bool SetSessionToDelete(string numSession) {
    using (MyDBEntities MyContext = new MyDBEntities()) {
        try {
            view_headerStatus view = (from v in MyContext.view_headerStatus
                                      where v.CodeSession == numSession
                                      where v.lastinserted == 1
                                      select v).First();

            if (view != null) {
                as_status status = (from s in MyContext.as_status
                                    where s.jobclsid == view.jobclsid
                                    where s.lastinserted == 1
                                    select s).First();
                if (status != null) {
                    status.DeleteSession = 1;
                    //MyContext.as_status.Attach(status);
                    //MyContext.ObjectStateManager.ChangeObjectState(status, EntityState.Modified);
                   MyContext.SaveChanges();
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }

        } catch (OptimisticConcurrencyException) {
            return false;
        } catch (Exception) {
            return false;
        }
    }
}
问题是为什么这个人的行为会有所不同??? 我读过很多关于EF和dataContext的帖子,但我觉得我遗漏了一些东西。如果有人能帮忙,我会很高兴的。
谢谢。

在您的第一个示例中,这行代码如下:

as_status status = GetStatus(session);
我假设它使用不同的上下文进行填充,当它离开GetStatus()方法时,用于加载的上下文被释放。这就是后续Attach()工作的原因。但是,在第二个示例中,不需要附加,因为它是使用当前(已连接)上下文加载的


要解决此问题,您可能需要将上下文传递给GetStatus()等方法,从而无需重新附加。我通常不会重新连接,除非我正在通过导线或文件恢复对象

哎呀!当然,你是对的!现在你说出来,这听起来很明显。谢谢,这真的很有帮助。