2009-09-25 78 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);