2011-01-19 9 views
3

LinqToSqlモデルのエンティティの1つに、SQL ServerのXML列にマップされたXElement型のフィールドがあります。Linq To Sqlのフィールドをダーティにマーク

私は次のようにします。

myEntity.MyXmlField.Add(new XAttribute("attribute", "value")); 
... 
DataContext.SubmitChanges(); 

フィールドがデータベースに更新されません(ただし、他のフィールドが行います)。 私は、DataContextがXElement内で行われた変更を追跡できないため、このフィールドはダーティとマークされておらず、更新もされません。

これは正しい仮定ですか、どのように修正できますか?

EDIT

スクラムマイスターが提供するリンクを読んだ後、それは

myEntity.MyXmlField = new XElement(myEntity.MyXmlField); 

が問題を解決するように見えます。

しかし、このソリューションはXElement(クローン作成が容易なため)に非常に特有であり、XElementが大きい場合には多くの処理が必要です。

フィールドが変更されたことをDataContextに知らせる一般的な方法があるはずです。

+0

可能な複製http://stackoverflow.com/questions/689772/linq-to-sql-with-xml-database-fields-why-does- this-work –

答えて

2

リフレクションを使用してLinq-to-SQLの内部チェンジトラッカーを取得することができます。あなたのアプリが制限された信頼関係で実行されていない限り動作します。サンプルについては、次のスレッドを参照してください。

What's the cleanest way to make a Linq object "dirty"?
Can you convince a DataContext to treat a column as always dirty?

+0

ニース!まあ、並べ替え:)私は 'XElement.Changed'イベントにフックできるので、清潔ではありませんが、問題を解決し、さらに柔軟性があります。 –

1

ここでの問題は、XML列の値を変更しても「変更された」とマークされないことです。参照は変更されないため、マッパーは変更されたことを認識しません。

答えは驚くほど簡単です:

var field = new XElement(myEntity.MyXmlField); 
field.Add(new XAttribute("attribute", "value")); 
myEntity.MyXmlField = field; 
+0

LinqToSqlデザイナーによって生成されたセッターで、 'if(this._Responses!= value){...}'というチェックがあるので、これは機能しません。したがって、同じオブジェクト参照にプロパティを設定しても効果はありません。 –

+0

はい、あなたは正しいです、私はしばらくの間これをやっていないし、忘れてしまった。今修正するための編集... –

2

さてさて、これは既知の問題であるように見えます: http://connect.microsoft.com/VisualStudio/feedback/details/360433/linq-to-sql-xml-fields-dont-update

Microsoftの勧告は、だから私はそれを取る

myEntity.MyXmlField = new XElement(myEntity.MyXmlField); 

を使用することですこれを改善するためのより良いまたは一般的な方法はありません。

+0

いいえ、私は数年前にこれとかなりの時間を費やしました。ある意味では、SQLにプッシュされる他のすべての型は通常は値型であり、これ(参照型)は例外です。私の答えのように、あなたのものと同じように、新しい参照を作成することができます。 –