在页面休假时强制执行ObjectStateManager条目删除

时间:2010-02-12 14:53:50

标签: asp.net-mvc entity-framework wizard objectstatemanager

我有一个基于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();

    }

1 个答案:

答案 0 :(得分:1)

您似乎在多个请求中使用单个ObjectContext实例。不要那样做。它会让你感到痛苦。它使您的Web服务器有状态。在呈现响应之后处理ObjectContext(我们间接地从Controller.Dispose执行),并为下一个请求新建一个新对象。