如何更新LINQ-to-SQL单XML记录?

时间:2011-11-11 00:57:14

标签: c# xml linq-to-sql

所以基本上我在XML中有这个字段,我想要更新。它是通过XML解析的,我不知道如何从这个单个实例更新这个单个记录。

var dataContext = 
    new RequestFormsDBDataContext(ConfigManager.Data.ConnectionString);

var userForm = (
    from i in dataContext.RequestFormItems
    join c in dataContext.RequestFormInstances on i.TypeGuid equals c.TypeGuid
    where i.Id == FormID
    select new {
        i.Id,
        XmlData = XElement.Parse(i.XML)
    }
).ToList();


// Parsing out XML Data
var userFormParced = (
    from i in userForm
    select new FormItem {
        FormId = i.Id,
        DateTimeCompleted = i.XmlData.Element("DateTimeCompleted").Value
    }
).FirstOrDefault();

RFDateTimeCompleted = userFormParced.DateTimeCompleted;

// Code that isnt working
userFormParced.DateTimeCompleted = "New Data";
dataContext.SubmitChanges();

1 个答案:

答案 0 :(得分:2)

这不起作用,因为您没有更改从数据库中检索的实例。您正在使用原始值创建一个新对象 - 两次 - 然后更改它。 LINQ-to-SQL上下文不知道您正在更改数据库行,只知道您构建的一些不相关的XML。

首先,您从数据库中检索的值将被放入XElement

XmlData = XElement.Parse(i.XML)

然后从节点中检索'value'并将其放入另一个新对象

select new FormItem 
{         
    FormId = i.Id,         
    DateTimeCompleted = i.XmlData.Element("DateTimeCompleted").Value     
} 

此阶段失去了对LINQ-to-SQL上下文的任何引用。相反,您需要将其更改

如果您在数据库中使用XML,则应该使用XML列,这些列映射到LINQ-to-SQL对象中的XML属性。你没有,所以我们将实施一个解决方法。

尝试这样的事情。

// just get the item
var userForm = (
    from i in dataContext.RequestFormItems
    join c in dataContext.RequestFormInstances on i.TypeGuid equals c.TypeGuid
    where i.Id == FormID
    select i).FirstOrDefault();

// parse the XML
var xml = XElement.Parse(userForm.XML);

RFDateTimeCompleted = xml.Element("DateTimeCompleted").Value;
xml.Element("DateTimeCompleted").Value = "New Data";

// and finally, because you're again just changing XML 
// unrelated to the context, update the original object
userForm.XML = xml.ToString();
context.SubmitChanges();