2017-06-13 5 views
0

テーブルのXML列に格納されたXMLオブジェクトの特定の属性を匿名化するためのLINQpadスクリプトを作成しています。データにアクセスしてから変更し、LINQpad Dump()を使用して更新されたようです。しかし、SubmitChanges()を実行してからLINQ(またはSQL Server)から別のクエリを実行すると、関連する行が更新されていません。LINQ SQLクエリ、SubmitChangesがDBへの変更を送信していません

私はこの問題を見つけようとしました。私が見つけた共通の問題はプライマリキーに関連しています。私はSQLStudioで使用中のテーブルにプライマリキーがあることを確認しました。 。

また、最初の行では、DataContextのログをConsole.Outに設定しています。これで、最初のクエリ(select)が動作することを確認するための2行が得られます。しかし、UpdateRecord関数を実行した後、またはSubmitChangesを実行した後に、コンソールでUPDATEクエリを取得できません。おそらく更新ロジックが正しくありませんか?

更新は:。私はGetChangeSetを追加()ダンプ()のSubmitChangesを実行する前に、私のUpdateRecordデータベース機能が正しく何が更新されていない確認し、0の更新とチェンジで0挿入があります。

void Main() { 
    Log = Console.Out; 

    AnonymiseCommand("MyCommandName"); 

} 

void AnonymiseCommand(string command) { 

    // Note we need to pluralise the table name for the LINQ query 
    // Table is actually called ChangeSet_Detail 
    var results = ChangeSet_Details 
        .Where(c => c.Command.ToString().Contains(command)) 
        .ToDictionary(row => (int) row.ChangeSetID, 
            row => row.Changes); 

    int commandCount = results.Count; 
    Print("Command count for " + command + " is " + commandCount + ".");  

この時点まではすべて正常に動作し、commandCountは正しく1を返し、結果ディクショナリには正しい値が含まれます。次に、辞書を反復し、dictsキーに一致するIDを持つ行を更新し、XElementをキーにマップします。

foreach (KeyValuePair<int, XElement> entry in results) { 
     AnonymiseXml(entry.Value); 
     UpdateRecord(entry.Key, entry.Value); 
    } 

} 

// This function isn't so important, it anonymises the attributes and seems to work 
void AnonymiseXml(XElement xml) { 
    // anonymise attributes 
    var attributes = xml.Attributes(); 
    foreach(var attr in attributes) { 
     attr.Value = new String('?', attr.Value.Length); 
    } 

    // repeat across child nodes 
    var kiddies = xml.Elements(); 
    foreach (var kid in kiddies) { 
     AnonymiseXml(kid); 
    } 
} 

void UpdateRecord(int rowID, XElement newXml) { 
    ChangeSet_Detail entry = 
     (from c in ChangeSet_Details 
      where c.ChangeSetID == rowID 
      select c).Single(); 

    entry.Dump(); 
    entry.ChangeSetID = rowID; 
    entry.Changes = newXml; 
    entry.Dump(); 

    GetChangeSet().Dump(); 

    try{ 
     SubmitChanges(); 
    } catch(Exception e) { 
     e.Dump(); 
    } 

} 

UpdateRecord関数は、DBへの変更をコミットしようとしているところです。私が現在見ている行IDと新しいXML要素を渡します。エントリを取得すると、最初のentry.Dump()で変更がまだ有効であるように見えますが、属性が匿名化されていることがわかります。とにかく、項目XML列(列の名前は変更)を変更し、最後にSubmitChanges()を呼び出します。

LINQpadまたはSQL Serverでテーブルをクエリすると、変更が有効にならず、属性が匿名化されていません。

+0

あなたは()メソッドのSubmitChangesのあなたのコードの実装を提供していただけますか? – jcruz

+0

SubmitChanges()はLINQメソッドです – dahui

+0

解決しました。回答を入力してください... – dahui

答えて

0

自分で解決しました。

私は、XML値を変更していると思います。つまり、オブジェクト参照は変更されません。つまり、XElementとそのオブジェクトはそのままですが、属性の文字列値を変更します。これはおそらくLINQ変更を検出しません。

SubmitChanges()を実行する前にLINQに変更を反映させると、更新がログに記録され、変更が保持されます。

追加された行は単純です:

Refresh(RefreshMode.KeepCurrentValues, entry); 
関連する問題