Một số nền: Tôi có một cơ sở dữ liệu mà tôi muốn sử dụng linq-to-sql để cập nhật thông qua ứng dụng C#. Một trong các cột trong bảng này có một kiểu dữ liệu XML. Mỗi cột khác trong bảng đó (không phải là một kiểu dữ liệu XML) cập nhật hoàn toàn tốt, nhưng khi tôi thực hiện thay đổi đối với trường XML, chương trình thực thi (có vẻ) đúng, nhưng trường luôn giữ nguyên giá trị ban đầu sau khi tôi chạy SubmitChanges()
.LINQ-to-SQL Với các trường cơ sở dữ liệu XML - Tại sao tính năng này hoạt động?
Tôi nhìn quanh internet và tìm thấy một vài bài viết trên Microsoft Connect chẩn đoán vấn đề tương tự và cuối cùng stumbled trên giải pháp here:
Để buộc cập nhật lĩnh vực XML này sẽ không làm:
XElement tmp = MyLinqObject.XmlField;
MyLinqObject.XmlField = null;
MyLinqObject.XmlField = tmp;
Thay vào đó để buộc LINQ cập nhật cột XML chỉ định một đối tượng được sao chép:
MyLinqObject.XmlField = new XElement (MyLinqObject.XmlField);
Tôi có thể xác nhận rằng điều này thực sự có vẻ như k, nhưng tôi không chắc chắn lý do tại sao. Đoán duy nhất của tôi là thuộc tính XmlField có một số loại định danh duy nhất trên heap và bằng cách tạo bản sao, bạn đã gán cho nó một mã định danh duy nhất mới. Khi LINQ sau đó tạo truy vấn, nó thậm chí không cố gắng để xem nếu trường đã được cập nhật, vì nó có một id mới, nó chỉ đơn giản là viết giá trị cho cơ sở dữ liệu. Nhưng, tôi chỉ đơn giản suy đoán và hy vọng rằng một người khác có thể cung cấp một sự hiểu biết tốt hơn về những gì đang diễn ra đằng sau hậu trường.
EDIT: Để giải quyết bài đăng của Jon, lý do cho vấn đề (như được giải thích trên trang web MS Connect) là "trường XML không cập nhật vì LINQ-to-SQL không xử lý XElement .Thay đổi sự kiện ".
Đối với thực hiện của tôi, mã mà làm việc kết thúc lên tìm kiếm một cái gì đó như thế này:
MyXElementProperty.SetElementValue("Author", author);
MyXElementProperty = new XElement(MyXElementProperty);
Để tham khảo (cho bất cứ ai khác mà tìm thấy câu hỏi này), sau đây cũng làm việc:
MyXElementProperty = new XElement(MyXElementProperty);
MyXElementProperty.SetElementValue("Author", author);
Được cập nhật để hy vọng giải quyết các câu hỏi của bạn. Nhìn chung, lời giải thích của bạn có ý nghĩa. – jerhinesmith
Vì vậy, bạn đang thiết lập thuộc tính * sau * bạn đã thực hiện thay đổi? Tôi hơi ngạc nhiên khi làm việc, thành thật mà nói ... Tôi mong đợi nó sẽ có cùng một vấn đề.Có lẽ nó thực sự chỉ là sử dụng bình đẳng tham chiếu. –
Trên thực tế, tôi chỉ thử nó sau khi thay đổi thứ tự và cả hai cách dường như làm việc. Không chắc chắn nếu điều đó làm cho nó nhiều hơn hoặc ít gây nhầm lẫn. – jerhinesmith