2009-09-25 81 views
0

我已經有了一個簡單的LINQ to sql對象。我從數據庫中抓取它並更改一個字段然後保存。用LINQ to Sql對象進行更新時遇到問題

沒有行更新。 :(

當我檢查是通過網絡發送完整的SQL代碼,我注意到,它的更新到行,而不是通過主鍵,但在所有通過的條款。這哪裏是田野正常嗎?我會認爲使用主鍵上的where子句更新字段是很容易的,而不是每個字段上的where(是一個字:P)

這裏是代碼...

using (MyDatabase db = new MyDatabase()) 
{ 
    var boardPost = (from bp in db.BoardPosts 
     where bp.BoardPostId == boardPostId 
     select bp).SingleOrDefault(); 

    if (boardPost != null && 
     boardPost.BoardPostId > 0) 
    { 
     boardPost.ListId = listId; // This changes the value from 0 to 'x' 
     db.SubmitChanges(); 
    } 
} 

和這裏的一些樣本SQL ..

exec sp_executesql N'UPDATE [dbo].[BoardPost] 
SET [ListId] = @p6 
WHERE ([BoardPostId] = @p0) AND .... <snip the other fields>',N'@p0 int,@p1 int,@p2 nvarchar(9),@p3 nvarchar(10),@p4 int,@p5 datetime,@p6 int',@p0=1276,@p1=212787,@p2=N'ttreterte',@p3=N'ttreterte3',@p4=1,@p5='2009-09-25 12:32:12.7200000',@p6=72 

現在,我知道有這個更新中的日期時間字段..當我檢查數據庫它的值是/'2009-09-25 12:32:12.720'(少於零的,比上面)..所以我不知道這是不是搞亂了從句條件...

但仍然!它應該在PK的where子句中..如果有的話......速度!

是/否?


UPDATE

閱讀nitzmahone的答覆後,我再試着用一些價值觀樂觀併發玩耍,和它仍然沒有工作:(

於是我開始了一些新的東西...在樂觀併發的情況下,它包含了試圖更新的字段上的where子句,當它發生時,它不起作用

so ...在上面的sql中,where子句看起來像這樣...

WHERE ([BoardPostId] = @p0) AND ([ListId] IS NULL) AND ... <rest snipped>) 

這聽起來不對!在我進行更新之前,數據庫中的值爲空。但是當我將ListId值添加到where子句(或者更重要的是,當L2S由於optomistic concurrecy而添加時),它無法找到/匹配該行。

wtf?

回答

3

如果你不知道爲什麼,where子句的東西是正常的 - 谷歌「樂觀併發」。您可以通過在dbml設計器中將所有字段設置爲「UpdateCheck:Never」來選擇退出該行爲(但明白您正在放棄重要的安全檢查)。

更新失敗的事實很可能是由於DBML和DB之間的數據類型或源值不匹配造成的(它們很容易失去同步 - 有第三方工具可以將DBML與DB進行比較)的東西)。爲了測試,請嘗試運行您在SSMS中捕獲的更新語句,但從where子句中刪除值直到得到「1行受影響」。一旦它起作用,你就找到了你的問題專欄。

+0

喜尼茨把這個,我已經更新了原來的職位。你能檢查出來嗎?我已根據您在這裏的評論更新了它。 – 2009-09-25 04:05:37

+0

上面的代碼註釋中提到「將值從0更改爲x」 - 如果它真的是0(而非null),那就是您的問題 - 您在該列的DBML的Nullable屬性或服務器數據類型中存在不匹配。如果它確實在數據庫中可以爲空,請確保設計器中的Nullable屬性爲true,並且服務器數據類型屬性不是「NOT NULL」 – nitzmahone 2009-09-25 04:20:39

+0

@Nitz - 如果我決定不使用樂觀併發並更改所有的領域「UpdateCheck:從來沒有」,我需要在主鍵字段上做到這一點?如果我這樣做,L2S是否足夠聰明以便由PK進行更新,然後呢? – 2009-09-27 00:21:35

0

您正在描述的行爲表明您的數據庫和您的Linq to SQL對象已經不同步。您應該嘗試從Linq to SQL類設計器中刪除該類,保存並從數據庫資源管理器中將該表拖回到設計器中,然後再次保存。這應該清除更新問題。

0

嘗試之前submitchanges()

_tdIssuesLog.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, issueslog);