Немного предыстории: у меня есть база данных, которую я хочу использовать linq-to-sql для обновления через приложение C #. Один из столбцов в этой таблице имеет тип данных XML.
Каждый второй столбец в этой таблице (который не относится к типу данных XML) обновляется совершенно нормально, но когда я решил внести изменения в поле XML, программа выполняется (на первый взгляд) правильно, но поле всегда сохраняет свой исходный значение после запуска SubmitChanges()
.
Я просмотрел Интернет и нашел несколько сообщений в Microsoft Connect, в которых диагностируются подобные проблемы, и, наконец, наткнулся на решение здесь :
Для принудительного обновления поля XML это не сработает:
XElement tmp = MyLinqObject.XmlField;
MyLinqObject.XmlField = null;
MyLinqObject.XmlField = tmp;
Вместо этого, чтобы заставить LINQ обновить столбец XML, назначьте клонированный объект:
MyLinqObject.XmlField = new XElement (MyLinqObject.XmlField);
Я могу подтвердить, что это действительно работает, но я не совсем уверен, почему. Я могу только предположить, что у свойства XmlField есть какой-то уникальный идентификатор в куче и что, создав клон, вы присвоили ему новый уникальный идентификатор. Когда Linq генерирует запрос, он даже не пытается увидеть, было ли поле обновлено, поскольку у него новый идентификатор, он просто записывает значение в базу данных. Но я просто размышляю и надеюсь, что кто-то еще сможет лучше понять, что происходит за кулисами.
РЕДАКТИРОВАТЬ : При рассмотрении сообщения Джона причина проблемы (как это объясняется на сайте MS Connect) заключается в том, что «поле XML не обновляется, поскольку Linq-to-SQL этого не делает. обработать событие XElement.Changed ".
Для моей реализации работающий код выглядит примерно так:
MyXElementProperty.SetElementValue("Author", author);
MyXElementProperty = new XElement(MyXElementProperty);
Для справки (любому, кто найдет этот вопрос), также работает следующее:
MyXElementProperty = new XElement(MyXElementProperty);
MyXElementProperty.SetElementValue("Author", author);