我已经有了一个简单的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