所以基本上我在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();
答案 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();