Как обновить отдельную XML-запись LINQ-to-SQL? - PullRequest
1 голос
/ 11 ноября 2011

Так что в основном у меня есть это поле в 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 Ответ

2 голосов
/ 11 ноября 2011

Это не сработает, потому что вы не меняете экземпляр, который вы извлекаете из базы данных. Вы создаете новый объект, используя значения из оригинала - дважды - и затем изменяете его. Контекст 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();
...