C# ASP.NET MVC 3-会话中存储的Linq到SQL对象

C# ASP.NET MVC 3-会话中存储的Linq到SQL对象,c#,linq-to-sql,asp.net-mvc-3,C#,Linq To Sql,Asp.net Mvc 3,我在MVC中有一个多页面(多视图)表单,其结果将保存到单个数据库表中 初始化表单第一页中linq对象的代码段 public ActionResult MyForm() { // returns a Linq object stored in session Application currentApp = Application.FromSession(); // if null, initialize the object and save to session

我在MVC中有一个多页面(多视图)表单,其结果将保存到单个数据库表中

初始化表单第一页中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”,表 “我的桌子”; 列不允许空值。插入 失败。声明已被修改 终止


在本例中,ApplicationData是xml类型的列,LINQ将其解释为XElement对象。当我在SubmitChanges()处设置断点并检查app.ApplicationData的值时,它显然已填充(非空),但我仍然会收到此错误。我唯一的想法是我误解了数据上下文的工作方式。不过,这篇专栏似乎只有一个问题。我是否需要找出一种方法将XElement对象(ApplicationData)附加到我的活动数据上下文(_db)中,如果是这样,我将如何执行此操作?

我的建议是比较上下文模型和数据库表中“ApplicationData”列的数据类型

另外,请在数据类型本身上再次检查此列“AppliationData”的LINQ到SQL映射


如果你发现任何东西,请更新你的帖子

好的,那么在您提到的action方法中,您可以检查在最终调用db.SubmitChanges()之前是否在其他任何地方再次调用InsertOnSubmit方法……或者是否多次调用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属性值?

请查看生成并发送到服务器的实际SQL


启动SQL Server Profiler(在SQL Server Management Studio的“工具”菜单上)并启动跟踪。运行应用程序直到崩溃。返回到SQL分析器并查看SQL查询。从SQL端查看某些内容有时可以很容易地发现错误,例如,找出您的应用程序是否正在执行多个插入而不是一个插入。

您的代码暗示您正在尝试插入currentApp,但您的注释显示您已检查应用程序中的列值。这些引用指向不同的对象。我缺少什么?currentApp是从会话加载的,因为它对Linq对象进行了部分更新。我不能每次简单地从DB保存/重新加载的原因是,在这个表单的多个页面中都有必填字段,这就是为什么我要将它保持在会话中。发布页面时,我只使用来自该特定页面的值更新会话实例。在发布最后一页之前,我不会保存到DB。dbml中的ApplicationData显示为System.Xml.Linq.XElement类型,如预期的那样。服务器数据类型如预期的那样为“Xml NOT NULL”。DB表中此列的数据类型是什么?是否可以发布对象的属性映射(即使用ApplicationData列)?这将给我一些可以处理的东西…由于在会话中存储对象需要序列化,难怪我遇到了困难。最后,我更改了代码,以便在每个请求期间加载/重新加载DB记录,并将所有字段更改为可空,以便可以在不出现SQL错误的情况下部分更新记录。