2011-02-03 11 views
2

私は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)にアタッチする方法を理解する必要がありますか?もしそうなら、私はそれをどうやってやりますか?

+0

あなたのコードはcurrentAppを挿入しようとしていることを示していますが、あなたのコメントにはアプリの列の値がチェックされているようです。参照先は異なるオブジェクトです。私は何が欠けていますか? – Sorax

+0

CurrentAppは、Linqオブジェクトの部分的な更新があるため、Sessionからロードされます。なぜなら、単にDBからセーブ/リロードすることができない理由は、このフォームの複数のページに必要なフィールドが広がっているからです。そのため、私はセッションでそれを保持しています。ページがポストされると、その特定のページから来た値だけでセッションインスタンスが更新されます。私は最後のページが掲載されるまでDBに保存しません。 – Keith

答えて

4

生成された実際のSQLを見て、サーバーに送信してください。

(SQL Server Management Studioのツールメニューの)SQL Server Profilerを起動し、トレースを開始します。アプリケーションがクラッシュするまで実行します。 SQLプロファイラに戻り、SQLクエリを確認します。 SQLの終わりからのものを見ることで、エラーを見つけやすくなることがあります。あなたが1つではなく複数の挿入を行っているかどうかを調べる。

+0

Sessionにオブジェクトを格納するにはシリアライズが必要なため、難しかったのは不思議ではありません。私はコードを変更して各リクエスト中にDBレコードをロード/リロードし、すべてのフィールドをNullableに変更したので、SQLエラーなしでレコードを部分的に更新することができました。 – Keith

0

私はあなたのコンテキストモデルとデータベーステーブルの "ApplicationData"列のデータ型を比較す​​ることをお勧めします。

また、データ型自体にこの列「AppliationData」のLINQ to SQLマッピングを確認してください。

してくださいあなたが何かを見つけた場合、あなたが最終的にdb.SubmitChangesを(呼び出している前に、あなたはどこにも再びInsertOnSumbitメソッドを呼び出している場合は、あなたが言及したアクションメソッドでは、あなたがチェックできるように、...

+0

dbmlのApplicationDataは、期待どおりSystem.Xml.Linq.XElement型として表示されます。期待どおり、サーバーのデータ型は "Xml NOT NULL"です。 – Keith

+0

DBテーブルのこの列のデータ型は何ですか? – NiK

+0

データ型はxml – Keith

0

[OK]をあなたのポストを更新)...またはInsertOnSubmitメソッドを複数回呼び出す場合は、同じオブジェクトに対して2回呼び出すと問題が発生すると思います。

更新: 私は1つのテーブルでサンプルを試してみましたが、下記のようにxmlデータを挿入できました。

DataClassesDataContext ctx = new DataClassesDataContext(); 
    Application a1 = new Application(); 
    XName n = "dfdsf"; 
    a1.ApplicationData = new XElement(n); 
    ctx.Applications.InsertOnSubmit(a1); 
    ctx.SubmitChanges(); 

ここで、あなたの列データはどのように表示されますか?アプリケーションデータのサンプルコンテンツを投稿することができれば役立ちます。 ApplicationDataプロパティ値をどのように設定していますか?

+0

いいえ、一度だけ呼び出す。 – Keith