0

我有一个基于巨人肩膀的编辑 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();

    }
4

1 回答 1

1

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

于 2010-02-12T18:04:41.660 回答