2011-09-26 31 views
2

當我執行下面的代碼時,我不會收到任何錯誤,但它不會更新數據庫上的更改。我在表用戶中有5個條目,執行以下代碼後,數據庫中沒有「活動」狀態的用戶。使用LINQ to SQL來更新數據庫?

我應該自己寫更新聲明還是爲我做?這裏有什麼問題?

var dbContext = new DataClasses1DataContext(); 

List<user> users = (from u in dbContext.users 
          where u.age < 30 
          select u).ToList(); 

users[0].state = "Active"; 
dbContext.SubmitChanges(); 

編輯:

所以我知道是什麼問題。 我更改我的對象上的狀態,並更新語句包含作爲where子句的狀態。 所以當執行查詢時,它找不到匹配的項目 - 它在[state] = @p4上失敗。

爲什麼當我有主鍵時,在更新語句中使用所有參數?

UPDATE [dbo].[user] 
SET [state] = @p5 
WHERE ([id] = @p0) AND ([firstName] = @p1) AND ([lastName] = @p2) 
    AND ([age] = @p3) AND ([state] = @p4) 
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1] 
-- @p1: Input NChar (Size = 10; Prec = 0; Scale = 0) [firstName  ] 
-- @p2: Input NChar (Size = 10; Prec = 0; Scale = 0) [lastName ] 
-- @p3: Input Int (Size = -1; Prec = 0; Scale = 0) [25] 
-- @p4: Input NChar (Size = 10; Prec = 0; Scale = 0) [Active ] 
-- @p5: Input NChar (Size = 10; Prec = 0; Scale = 0) [Active] 
+1

這樣看起來好吧,你確定你的物品是年齡<30嗎? – Raymund

+0

是的,我從該查詢中取回3個項目 – aryaxt

+0

我測試了您的代碼段,它適用於我。您向我們展示的代碼之外有一些內容會導致問題。你能發佈一個完整的DDL SQL嗎? –

回答

2

您需要更改DBML上的併發模式。關於Updating LINQ-to-SQL entities的這個網站解釋了一些。

任何你希望WHERE子句中包括應該有自己的一套Update CheckNever的DBML。

  • 打開DBML
  • 選擇user對象
  • 按F4在state屬性(見屬性)
  • 變化Update Check(屬性中的最後一項設置),以Never
  • 保存並嘗試再次

通常我會關閉Update Check爲所有列,但你應該做更多的閱讀,以瞭解它是如何工作的,以防你需要併發。

+1

@aryaxt我知道。 'Update Check'不會停止更新列,它會阻止它們被包含(即檢查)在WHERE子句中。這個答案將解決你的問題。 –

+0

謝謝,這解決了更新語句的問題,但它仍不會更新數據庫。 – aryaxt

1

顯然,用戶表上沒有主鍵,或者您沒有在您的dbml文件中指定它。當您插入或刪除沒有主鍵的記錄時,LINQ to SQL僅引發異常。由於某些原因,它在更新時不會引發異常。

+0

我確實有一個主鍵 – aryaxt

+0

您是否檢查過您的dbml設計器中主鍵列的主鍵屬性?它是「真」嗎? – evpo

+0

是它被設置爲true,並且主鍵圖標顯示在我的「id」字段 – aryaxt