如何更新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。
首先,将从数据库检索到的值放入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();