Некоторые предпосылки: у меня есть база данных, которую я хочу использовать 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);