2011-02-03 47 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属性值?