0

我有一个简单的 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),它无法找到/匹配该行。

什么?

4

3 回答 3

3

where 子句的东西是正常的——如果你不知道为什么,谷歌“乐观并发”。您可以通过在 dbml 设计器中将所有字段设置为“UpdateCheck:Never”来选择退出该行为(但请理解,这样做会放弃重要的安全检查)。

更新失败的事实可能是由于 DBML 和 DB 之间的数据类型或源值不匹配(它们很容易不同步——有 3rd 方工具可以将 DBML 与 DB 进行比较)。要进行测试,请尝试运行您在 SSMS 中捕获的更新语句,但从 where 子句中删除值,直到您获得“1 行受影响”。一旦它起作用,你就找到了你的问题列。

于 2009-09-25T03:07:41.320 回答
0

您所描述的行为表明您的数据库和 Linq to SQL 对象已不同步。您应该尝试从 Linq to SQL 类设计器中删除该类,保存,将表从数据库资源管理器拖回设计器中,然后再次保存。这应该可以解决更新问题。

于 2009-09-25T03:12:11.807 回答
0

试着把这个放在前面submitchanges()

_tdIssuesLog.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, issueslog);
于 2010-03-24T18:11:39.240 回答