Linq-to-SQL с полями базы данных XML - Почему это работает?

Некоторые предпосылки: у меня есть база данных, которую я хочу использовать linq-to-sql для обновления через приложение С#. Один из столбцов в этой таблице имеет тип данных 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 генерирует запрос, он даже не пытается увидеть, было ли поле обновлено, так как оно имеет новый идентификатор, оно просто записывает значение в базу данных. Но я просто размышляю и надеюсь, что кто-то еще сможет лучше понять, что происходит за кулисами.

РЕДАКТИРОВАТЬ. Чтобы отправить сообщение Jon post, причина проблемы (как объясняется на сайте MS Connect) заключается в том, что "поле XML не обновляется, поскольку Linq-to-SQL doesn ' t обрабатывает событие XElement.Changed".

Для моей реализации код, который работает, выглядит примерно так:

MyXElementProperty.SetElementValue("Author", author);

MyXElementProperty = new XElement(MyXElementProperty);

Для справки (любому, кто находит этот вопрос), также работает следующее:

MyXElementProperty = new XElement(MyXElementProperty);

MyXElementProperty.SetElementValue("Author", author);

Ответ 1

Когда вы создадите новый XElement, вы создаете другой объект. Возможно, что для обнаружения "стойкости" оно использует ссылочное равенство, которое, очевидно, рассматривало бы это как новое значение.

В какой момент вы фактически вносите изменения в элемент? Я ожидал бы, что LINQ to SQL будет иметь кешированную копию исходного значения, а затем сравнить это с новым значением. Если он возьмет эту "кешированную копию", просто скопировав ссылку, то что бы вы ни делали с этим объектом, она всегда будет думать, что они равны. Если вместо этого вы создадите новый элемент, а затем измените его, то старый объект будет по-прежнему иметь старое значение, поэтому сравнение поймет, что вы внесли изменения. Это имеет смысл?

Ответ 2

Это был очень "другой" обходной путь, я потратил некоторое время, пытаясь понять, почему поле XML в базе данных не загружалось. Новый XElement (обновленныйXElement) работал и на меня!