我在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)中,如果是这样,我该怎么做呢?
你的代码意味着你试图插入currentApp,但你的评论说你检查了应用程序中的列值。这些引用是针对不同的对象。我错过了什么? – Sorax 2011-02-03 22:18:06
currentApp从会话中加载,因为它对Linq对象进行了部分更新。我无法每次简单地从数据库保存/重新加载的原因是,有必要的字段遍布在此表单的多个页面中,这就是为什么我将它保留在Session中的原因。在发布页面时,我只更新来自该特定页面的值的会话实例。在发布最终页面之前,我不保存到DB。 – Keith 2011-02-03 22:22:25