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

本文关键字:LINQ-to-SQL XML 记录 更新 何更新 | 更新日期: 2023-09-27 18:14:15

我有这个想要更新的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();

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

这不起作用,因为您没有更改从数据库检索的实例。您正在使用原始对象的值创建一个新对象-两次-然后更改它。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,则应该使用映射到LINQ-to-SQL对象中的XML属性的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();