Это не сработает, потому что вы не меняете экземпляр, который вы извлекаете из базы данных. Вы создаете новый объект, используя значения из оригинала - дважды - и затем изменяете его. Контекст LINQ-to-SQL не знает, что вы меняете строки базы данных, а только какой-то не связанный XML, который вы создали.
Во-первых, значение, которое вы получаете из базы данных, помещается в XElement
XmlData = XElement.Parse(i.XML)
и затем вы извлекаете 'значение' из узла и помещаете его в другой новый объект
select new FormItem
{
FormId = i.Id,
DateTimeCompleted = i.XmlData.Element("DateTimeCompleted").Value
}
На этом этапе теряется всякая ссылка на контекст LINQ-to-SQL. Вместо этого вам нужно изменить его вместо .
Если вы используете XML в своей базе данных, вы должны использовать столбцы XML, которые сопоставляются со свойствами XML в ваших объектах LINQ-to-SQL. Это не так, поэтому мы реализуем обходной путь.
Попробуйте что-нибудь подобное.
// 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();