我有一个简单的 linq to sql 对象。我从数据库中获取它并更改一个字段然后保存。
没有行已更新。:(
当我检查通过网络发送的完整 Sql 代码时,我注意到它对行进行了更新,不是通过主键而是通过 where 子句对所有字段进行更新。这是正常的吗?我原以为使用连接主键的 where 子句来更新字段会很容易,而不是在每个字段上使用 where'ing(是一个单词: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'(比上面少零)..所以我不是确定这是否弄乱了 where 子句条件......
但还是!它是否应该在PK的..如果有的话..为了速度做一个where子句!
是/否?
更新
在阅读了 nitzmahone 的回复后,我尝试在某些值上使用乐观并发,但它仍然没有工作:(
所以我开始了一些新的东西......随着乐观并发的发生,它在它试图更新的字段上包含了一个 where 子句。发生这种情况时,它不起作用。
所以..在上面的sql中,where子句看起来像这样......
WHERE ([BoardPostId] = @p0) AND ([ListId] IS NULL) AND ... <rest snipped>)
这听起来不太对!在我进行更新之前,数据库中的值为空。但是当我将 ListId 值添加到 where 子句时(或者更重要的是,当 L2S 添加它时,由于 optomistic concurrecy),它无法找到/匹配该行。
什么?