0

Shoulders of Giantsに基づいて編集された 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 モデルに関するエラーが発生ます。

この問題をカバーする方法はありますか?

//編集 いくつか読んだ後、リポジトリの基盤が良くないことがわかりました。ここにあるように。現在、同じ記事の「ビジネス トランザクションごとに 1 つの 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 に答える