我已經有了一個簡單的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?
喜尼茨把這個,我已經更新了原來的職位。你能檢查出來嗎?我已根據您在這裏的評論更新了它。 – 2009-09-25 04:05:37
上面的代碼註釋中提到「將值從0更改爲x」 - 如果它真的是0(而非null),那就是您的問題 - 您在該列的DBML的Nullable屬性或服務器數據類型中存在不匹配。如果它確實在數據庫中可以爲空,請確保設計器中的Nullable屬性爲true,並且服務器數據類型屬性不是「NOT NULL」 – nitzmahone 2009-09-25 04:20:39
@Nitz - 如果我決定不使用樂觀併發並更改所有的領域「UpdateCheck:從來沒有」,我需要在主鍵字段上做到這一點?如果我這樣做,L2S是否足夠聰明以便由PK進行更新,然後呢? – 2009-09-27 00:21:35