2017-06-13 42 views
0

我正在編寫一個LINQpad腳本來匿名存儲在表的XML列中的XML對象的某些屬性。我可以很好地訪問數據,然後改變它,並通過LINQpad Dump(),它似乎被更新。但是,當我運行SubmitChanges()並從LINQ(或SQL Server)運行另一個查詢時,相關行尚未更新。LINQ SQL查詢,SubmitChanges未提交對數據庫的更改

我試過用Google搜索這個問題,我發現的一個常見問題與主鍵有關,我在SQLStudio中驗證了使用的表中確實有主鍵,所以我不認爲這是問題。

此外,您可以在第一行中看到我已將DataContext上的Log設置爲Console.Out。有了這個,我得到了幾行驗證我的第一個查詢(選擇)的作品。但是,在運行UpdateRecord函數或運行SubmitChanges之後,我沒有在控制檯中得到任何類型的UPDATE查詢,也許更新邏輯不正確?我在運行SubmitChanges之前添加了GetChangeSet()。Dump(),在ChangeSet中有0個更新和0個插入,確認我的UpdateRecord函數沒有正確更新任何東西。

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,並且結果字典包含正確的值。接下來,我將迭代字典,並嘗試使用與匹配字典鍵的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函數是我試圖將更改提交給數據庫的地方。我傳入了當前正在查看的行ID以及新的XML元素。當我檢索條目時,似乎我的更改仍然有效,在第一個條目上。轉儲()我可以看到屬性是匿名的。我更改條目XML列(列名爲Changes),最後調用SubmitChanges()。

如果我然後在LINQpad或SQL Server中查詢表,我的更改沒有生效,並且屬性沒有被匿名化。

+0

能否請您提供您的代碼執行的SubmitChanges()方法? – jcruz

+0

SubmitChanges()是一個LINQ方法 – dahui

+0

解決了它,輸入一個答案... – dahui

回答

0

自己解決。所以我認爲問題是,我正在改變XML值,即對象引用永遠不會改變,XElement和它的對象保持不變,但我改變了屬性的字符串值,也許這意味着LINQ沒有檢測到變化。

當我告訴LINQ在運行SubmitChanges()之前刷新更改時,更新被記錄下來並且我的更改被保存。

添加的行很簡單:

Refresh(RefreshMode.KeepCurrentValues, entry);