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();
}