Пометить поля как грязные в Linq To Sql - PullRequest
3 голосов
/ 19 января 2011

Одна из моих сущностей в моей модели LinqToSql имеет поле типа XElement, сопоставленное со столбцом XML в SQL Server.

Когда я делаю следующее:

myEntity.MyXmlField.Add(new XAttribute("attribute", "value"));
...
DataContext.SubmitChanges();

Полене обновляется в базе данных (но другие поля делают).Я полагаю, что DataContext не может отслеживать изменения, сделанные внутри XElement, и поэтому это поле не помечено как грязное и не обновляется.

Это правильное предположение и как я могу это исправить?

РЕДАКТИРОВАТЬ

После прочтения ссылки, предоставленной Scrum Meister, похоже, что

myEntity.MyXmlField = new XElement(myEntity.MyXmlField);

решит проблему.

Однако эторешение весьма специфично для XElement (так как его легко клонировать) и требует большой обработки, если XElement большой.

Должен быть общий способ сообщить DataContext, что поле изменилось.

Ответы [ 3 ]

2 голосов
/ 19 января 2011

Хорошо, похоже, это известная проблема: http://connect.microsoft.com/VisualStudio/feedback/details/360433/linq-to-sql-xml-fields-dont-update

Microsoft рекомендует использовать

myEntity.MyXmlField = new XElement(myEntity.MyXmlField);

Итак, я так понимаю, нет лучшего или общего способа исправить это.

2 голосов
/ 19 января 2011

Вы можете получить внутренний трекер изменений Linq-to-SQL, используя отражение.Не очень, но это работает, если ваше приложение не работает с ограниченным доверием.Примеры см. В следующих темах:

Какой самый чистый способ сделать объект Linq «грязным»?
Можете ли вы убедить DataContext считать столбец всегда грязным?

1 голос
/ 19 января 2011

Проблема в том, что изменение значения столбца XML не помечает его как «измененный» - ссылка не изменяется, поэтому картограф не знает, что он изменился.

Ответ на удивление прост:

var field = new XElement(myEntity.MyXmlField);
field.Add(new XAttribute("attribute", "value")); 
myEntity.MyXmlField = field;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...