2011-09-26 42 views
2

当我执行下面的代码时,我不会收到任何错误,但它不会更新数据库上的更改。我在表用户中有5个条目,执行以下代码后,数据库中没有“活动”状态的用户。使用LINQ to SQL来更新数据库?

我应该自己写更新声明还是为我做?这里有什么问题?

var dbContext = new DataClasses1DataContext(); 

List<user> users = (from u in dbContext.users 
          where u.age < 30 
          select u).ToList(); 

users[0].state = "Active"; 
dbContext.SubmitChanges(); 

编辑:

所以我知道是什么问题。 我更改我的对象上的状态,并更新语句包含作为where子句的状态。 所以当执行查询时,它找不到匹配的项目 - 它在[state] = @p4上失败。

为什么当我有主键时,在更新语句中使用所有参数?

UPDATE [dbo].[user] 
SET [state] = @p5 
WHERE ([id] = @p0) AND ([firstName] = @p1) AND ([lastName] = @p2) 
    AND ([age] = @p3) AND ([state] = @p4) 
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1] 
-- @p1: Input NChar (Size = 10; Prec = 0; Scale = 0) [firstName  ] 
-- @p2: Input NChar (Size = 10; Prec = 0; Scale = 0) [lastName ] 
-- @p3: Input Int (Size = -1; Prec = 0; Scale = 0) [25] 
-- @p4: Input NChar (Size = 10; Prec = 0; Scale = 0) [Active ] 
-- @p5: Input NChar (Size = 10; Prec = 0; Scale = 0) [Active] 
+1

这样看起来好吧,你确定你的物品是年龄<30吗? – Raymund

+0

是的,我从该查询中取回3个项目 – aryaxt

+0

我测试了您的代码段,它适用于我。您向我们展示的代码之外有一些内容会导致问题。你能发布一个完整的DDL SQL吗? –

回答

2

您需要更改DBML上的并发模式。关于Updating LINQ-to-SQL entities的这个网站解释了一些。

任何你希望WHERE子句中包括应该有自己的一套Update CheckNever的DBML。

  • 打开DBML
  • 选择user对象
  • 按F4在state属性(见属性)
  • 变化Update Check(属性中的最后一项设置),以Never
  • 保存并尝试再次

通常我会关闭Update Check为所有列,但你应该做更多的阅读,以了解它是如何工作的,以防你需要并发。

+1

@aryaxt我知道。 'Update Check'不会停止更新列,它会阻止它们被包含(即检查)在WHERE子句中。这个答案将解决你的问题。 –

+0

谢谢,这解决了更新语句的问题,但它仍不会更新数据库。 – aryaxt

1

显然,用户表上没有主键,或者您没有在您的dbml文件中指定它。当您插入或删除没有主键的记录时,LINQ to SQL仅引发异常。由于某些原因,它在更新时不会引发异常。

+0

我确实有一个主键 – aryaxt

+0

您是否检查过您的dbml设计器中主键列的主键属性?它是“真”吗? – evpo

+0

是它被设置为true,并且主键图标显示在我的“id”字段 – aryaxt