2011-02-03 45 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失敗,錯誤

無法插入NULL值插入 列 '的ApplicationData',表 'MyTable的'; 列不允許有空值。 INSERT 失敗。該聲明已被終止 。

在這種情況下,ApplicationData是一個xml類型的列,該列被LINQ解釋爲XElement對象。當我在SubmitChanges()中設置斷點並檢查app.ApplicationData的值時,它顯然是填充的(非空),但我仍然會遇到這個錯誤。我唯一的想法是,我誤解了數據上下文的工作原理。它似乎只有這一列有問題。是否有可能需要找出一種方法將XElement對象(ApplicationData)附加到我的活動數據上下文(_db)中,如果是這樣,我該怎麼做呢?

+0

你的代碼意味着你試圖插入currentApp,但你的評論說你檢查了應用程序中的列值。這些引用是針對不同的對象。我錯過了什麼? – Sorax 2011-02-03 22:18:06

+0

currentApp從會話中加載,因爲它對Linq對象進行了部分更新。我無法每次簡單地從數據庫保存/重新加載的原因是,有必要的字段遍佈在此表單的多個頁面中,這就是爲什麼我將它保留在Session中的原因。在發佈頁面時,我只更新來自該特定頁面的值的會話實例。在發佈最終頁面之前,我不保存到DB。 – Keith 2011-02-03 22:22:25

回答

4

看看生成併發送到服務器的實際SQL。

啓動SQL Server Profiler(在SQL Server Management Studio的工具菜單上)並開始跟蹤。運行你的應用程序,直到它崩潰。回到SQL分析器並查看SQL查詢。從SQL端看事物有時可以很容易地發現錯誤,例如找出你是否做了幾個插入而不是一個。

0

那麼我的建議是比較Context模型和數據庫表中的「ApplicationData」列的數據類型。

此外請檢查您的LINQ到SQL映射再次在數據類型本身的列「AppliationData」。

請更新您的文章,如果你發現了什麼......

+0

dbml中的ApplicationData如預期的那樣顯示爲類型System.Xml.Linq.XElement。正如所料,服務器數據類型是「Xml NOT NULL」。 – Keith 2011-02-03 22:19:14

+0

數據庫表中此列的數據類型是什麼? – NiK 2011-02-03 22:21:33

0

好了,在你所提到的操作方法,你可以檢查,如果您呼叫的InsertOnSumbit方法再在其他地方,你終於打電話db.SubmitChanges之前( )...或者如果您多次調用InsertOnSubmit方法......我認爲如果您在同一個對象上調用它兩次,會導致問題。

更新: 我曾嘗試過使用單個表的示例,並能夠插入xml數據,如下所述。

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

所以,現在的問題是什麼不列數據看起來像???如果您可以發佈應用程序數據的示例內容,那麼它會很有幫助。另外你如何設置ApplicationData屬性值?