使用LINQ to SQL更新数据库?

时间:2011-09-26 02:07:51

标签: .net linq-to-sql

当我执行以下代码时,我没有收到任何错误,但它也没有更新数据库上的更改。表用户中有5个条目,执行以下代码后,数据库中没有“Active”状态的用户。

我应该自己编写更新声明还是为我做这个?这可能是什么问题?

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();

修改

所以我知道问题是什么。 我更改了对象的State,update语句将state作为where子句包含在内。 因此,在执行查询时,它无法找到匹配的项目 - 它在[state] = @p4上失败。

为什么在我有主键时使用update语句中的所有参数?

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]

2 个答案:

答案 0 :(得分:2)

您需要更改DBML上的并发模式。这个关于Updating LINQ-to-SQL entities的网站对此有所解释。

想要包含在WHERE子句中的任何内容都应该在DBML上将Update Check设置为Never

  • 打开DBML
  • 选择state对象
  • 上的user媒体资源
  • 按F4(查看属性)
  • Update Check(属性中的最后一项设置)更改为Never
  • 保存并重试

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

答案 1 :(得分:1)

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