2012-02-10 50 views
2

我有一個列表視圖與wpf Customername和Isvalid.I中的兩個列表使用linq to sql從我的sql table中獲取數據。當我嘗試更新表中的值時我沒有看到表中的任何變化。linq to sql提交更改不起作用

這裏是我的代碼時,我的保存按鈕點擊:

try 
     { 
      CustomersDataContext dataContext = new CustomersDataContext(); 
      Customer customerRow = MyDataGrid.SelectedItem as Customer; 
      string m = customerRow.CustomerName; 
      Customer customer = (from p in dataContext.Customers 
           where p.CustomerName == customerRow.CustomerName 
           select p).Single(); 

      customer.Isvalid=false; 

      dataContext.SubmitChanges(); 
      MessageBox.Show("Row Updated Successfully."); 

     } 
     catch (Exception Ex) 
     { 
      MessageBox.Show(Ex.Message); 
      return; 
     } 

我可以看到我能夠查詢基於選擇的客戶名稱的記錄,但該值沒有更新。

如果有人能指出我在哪裏丟失了將「ISVALID」值更新爲數據庫的邏輯,我將很高興。

+0

是IsValid在SQL中的布爾? – Flowerking 2012-02-10 16:40:42

+0

這裏是sql表的設計:CustomerName(nvarchar(MAX))IsValid(bit) – Macnique 2012-02-10 16:42:42

回答

5

首先,你的using(get_datacontext){...}塊在哪裏?當你完成它們時,你需要處理DataContext

反正...

我的猜測是,更新語句生成一個WHERE子句,這是太緊張,或者只是簡單的錯誤。

我會檢查Linq to Sql設計器映射表中每個列的'Update Check'屬性。最簡單的做法是將主鍵列設置爲Always並將所有其他設置爲Never。您也可以考慮將它們設置爲WhenChanged

設計者的默認行爲通常是將其設置爲Always的一切;這不僅會導致可怕的WHERE子句更新,但偶爾也會導致問題。顯然,這種行爲對於正確的併發檢查是必需的(即兩個線程更新同一行);所以要注意這一點。

噢,想着其他的東西 - 如果你的表沒有在設計器中指定的主鍵 - 你也可以得到這種行爲 - 確保其中一列是。

最後,您可以檢查在調用SubmitChanges時生成的SQL;通過將TextWriter附加到DataContext.Log屬性中;或者VS2010中的IntelliTrace同樣會收集所有在調試開始時運行的ADO.Net查詢。這對於調試爲什麼L2S不能按預期工作是非常有用的。

+1

:sql表中沒有主鍵,現在它在我設置主鍵後工作。 – Macnique 2012-02-10 21:07:21

0

您應該將更新後的客戶添加到更新客戶列表中。我的意思是在保存更改之前,您應該執行以下操作:db.AddToCustomers(customer)。在EF中使用AddToCustomers,我完全不知道它在LINQ中的等價物。

+0

你好,歡迎來到SO :)。您不必告訴Linq To Sql您更改了哪些對象;這就是變更追蹤的目的。 *我的第一個評論不是很高興,我取而代之。對不起,這是一個looong的一天* – 2012-02-10 17:24:49

+0

:))不幸的是,當我回答這個問題時,我完全不知道變化跟蹤!對不便帶來的不便;) – 2012-03-04 09:28:49

+0

沒有不便:)我希望我沒有讓你回答更多的問題! – 2012-03-04 10:10:08