私はMVCに複数ページの(マルチビュー)フォームを用意しています。その結果は単一のデータベーステーブルに保存されます。ASP.NET MVC 3 - セッションに格納されたLinqからSQLオブジェクトへ
フォームの最初のページでlinqオブジェクトを初期化するコードスニペット。
public ActionResult MyForm()
{
// returns a Linq object stored in session
Application currentApp = Application.FromSession();
// if null, initialize the object and save to session
if (currentApp == null)
{
currentApp = new Application();
currentApp.SessionSave();
}
return View(currentApp);
}
そして、ここでは、データベースが保存トリガーその後、強く型付けされたモデルからいくつかのデータを更新し、最終的な行動のためのコードのサンプルスニペットです。
[HttpPost]
public ActionResult MyForm3(Application app, FormCollection coll)
{
Application currentApp = Application.FromSession();
currentApp.Contact = app.Contact;
currentApp.AddFormToXml(coll);
currentApp.SessionSave();
_db.Applications.InsertOnSubmit(currentApp);
_db.SubmitChanges();
return RedirectToAction("Blah");
}
私はに実行している問題はでSubmitChangesがエラーで失敗したということです
列「applicationDataに」、テーブル 「MyTableという」内にNULL値を挿入できません。 列はNULLを許可しません。 INSERT が失敗します。ステートメントは 終了しました。
この場合、ApplicationDataはxml型の列で、LINQはXElementオブジェクトとして解釈します。 SubmitChanges()にブレークポイントを設定してapp.ApplicationDataの値をチェックすると、明らかに値が設定されています(nullではない)が、このエラーは引き続き発生します。私の唯一の考えは、データコンテキストがどのように機能するかを誤解しているということです。しかし、この1つの列に問題があるように見えます。 XElementオブジェクト(ApplicationData)をアクティブなデータコンテキスト(_db)にアタッチする方法を理解する必要がありますか?もしそうなら、私はそれをどうやってやりますか?
あなたのコードはcurrentAppを挿入しようとしていることを示していますが、あなたのコメントにはアプリの列の値がチェックされているようです。参照先は異なるオブジェクトです。私は何が欠けていますか? – Sorax
CurrentAppは、Linqオブジェクトの部分的な更新があるため、Sessionからロードされます。なぜなら、単にDBからセーブ/リロードすることができない理由は、このフォームの複数のページに必要なフィールドが広がっているからです。そのため、私はセッションでそれを保持しています。ページがポストされると、その特定のページから来た値だけでセッションインスタンスが更新されます。私は最後のページが掲載されるまでDBに保存しません。 – Keith