ASP.NET实体框架DataContext使用问题
我已经用EF建立了一个ASP.NET网站。我创建了一个DataContext类,它实现了singleton模式。我的DAO类(也包括单例)实例化此datacontext并将其存储在属性中。他们使用它来查询SQLServer数据库。这在3个月内运行正常,但我突然收到异常消息,如:“连接必须有效且已打开/连接已打开”。似乎没有处理datacontext。据我说,唯一的变化是数据大小和用户数量的增加 然后我发现有多篇帖子说singleton对datacontext是个坏主意,所以我尝试在每个请求中用using语句实例化datacontext,这就解决了问题,除了对数据库没有影响的更新查询。我必须将db对象附加到上下文,然后将其EntityState设置为“modified”,以使我的SaveChanges工作 像这样: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
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()等方法,从而无需重新附加。我通常不会重新连接,除非我正在通过导线或文件恢复对象 哎呀!当然,你是对的!现在你说出来,这听起来很明显。谢谢,这真的很有帮助。