我有一个基于Shoulders of Giants | A RESTful Wizard Using ASP.Net MVC… Perhaps? 的已编辑的RESTful向导。该向导有一个CANCEL按钮,按下该按钮时会触发下面的代码。
// If the user cancels, drop out altogether
if (!string.IsNullOrEmpty(CANCEL_BUTTON)) {
Session.Remove(VACANCYWIZARD_SESSION_KEY);
repository._entities.ObjectStateManager.GetObjectStateEntry(inProgressVacancyWizard.Vacancy).Delete();
return this.RedirectToAction("Index", "Home");
}
现在,为了能够在取消按钮之后调用 SaveChanges(),我必须从我的ObjectStateManager手动删除向导中的条目。但是当您通过手动返回主页取消向导时,它会保留,并且下一次调用_entities.SaveChanges()将抛出一个异常,它无法保存对象,从向导进度到数据库,因为它仍然处于对象状态。
请注意,在向导的步骤之间,我不将任何内容保存到数据库中。我将它保持在会话状态,每一步检索它:
NewVacancy inProgressVacancyWizard = Session[VACANCYWIZARD_SESSION_KEY] as NewVacancy;
然而,不知何故,inProgressVacancyWizard.Vacancy确实出现在ObjectStateManager中,所以我必须删除它,否则当调用 _entities.SaveChanges()时我会得到关于不完整的空位模型的错误另一个对象。
有没有办法解决这个问题?
//修改 经过一些阅读后,我发现我的存储库的基础不好。如找到 here。目前,我怀疑在同一篇文章中实现“每个业务事务的一个ObjectContext实例”中提到的选项。这是明智的吗?我想更多地了解它,因为它将是一个主要的重构。
public static Repository Instance
{
get
{
if (instance == null) {
instance = new Repository();
}
return instance;
}
}
#region Constructor: Repository()
/// <summary>
/// Constructor
/// </summary>
private Repository()
{
_entities = new DBModelEntitiesNew2();
}
答案 0 :(得分:1)
您似乎在多个请求中使用单个ObjectContext
实例。不要那样做。它会让你感到痛苦。它使您的Web服务器有状态。在呈现响应之后处理ObjectContext(我们间接地从Controller.Dispose
执行),并为下一个请求新建一个新对象。