テーブルの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でテーブルをクエリすると、変更が有効にならず、属性が匿名化されていません。
あなたは()メソッドのSubmitChangesのあなたのコードの実装を提供していただけますか? – jcruz
SubmitChanges()はLINQメソッドです – dahui
解決しました。回答を入力してください... – dahui