簡體   English   中英

使用XML數據庫字段的Linq-to-SQL - 為什么這樣做?

[英]Linq-to-SQL With XML Database Fields — Why does this work?

一些背景:我有一個數據庫,我想使用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然后生成查詢時,它甚至不會嘗試查看該字段是否已更新,因為它有一個新的id,它只是將值寫入數據庫。 但是,我只是在猜測並希望其他人能夠更好地了解幕后發生的事情。

編輯 :為了解決Jon的帖子,問題的原因(正如在MS Connect網站上解釋的那樣)是“XML字段不會更新,因為Linq-to-SQL不處理XElement.Changed事件”。

對於我的實現,有效的代碼最終看起來像這樣:

MyXElementProperty.SetElementValue("Author", author);

MyXElementProperty = new XElement(MyXElementProperty);

作為參考(對於發現此問題的任何其他人),以下內容也有效:

MyXElementProperty = new XElement(MyXElementProperty);

MyXElementProperty.SetElementValue("Author", author);

當你把它作為一個新的XElement ,你正在制作一個不同的對象。 有可能使用引用相等來檢測“陳舊性”,這顯然會將其視為新值。

你到底在什么時候對元素進行了更改? 希望 LINQ to SQL具有原始值的緩存副本,然后將其與新值進行比較。 如果只是通過復制引用來獲取“緩存副本”,那么無論你對該對象做什么,它總會認為兩者是相等的。 如果您創建一個元素,然后更改 ,那么舊對象仍將具有舊值,因此比較將理解您已進行了更改。 那有意義嗎?

這是一個非常“不同”的解決方法,我花了一段時間試圖弄清楚為什么數據庫上的XML字段沒有上傳。 New XElement(updatedXElement)也適合我!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM