我有一个基于巨人肩膀的编辑 RESTful 向导 | 一个使用 ASP.Net MVC 的 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()时,我会收到关于不完整Vacancy模型的错误。
有没有办法解决这个问题?
//edit 经过一番阅读,我发现我的存储库的基础并不好。如发现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();
}