当我执行以下代码时,我没有收到任何错误,但它也没有更新数据库上的更改。表用户中有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]
答案 0 :(得分:2)
您需要更改DBML上的并发模式。这个关于Updating LINQ-to-SQL entities的网站对此有所解释。
您 想要包含在WHERE
子句中的任何内容都应该在DBML上将Update Check
设置为Never
。
state
对象user
媒体资源
Update Check
(属性中的最后一项设置)更改为Never
通常我会关闭所有列的Update Check
,但是如果需要并发,你应该做更多的阅读以了解它是如何工作的。
答案 1 :(得分:1)
显然,用户表上没有主键,或者您没有在dbml文件中指定主键。 LINQ to SQL仅在插入或删除没有主键的记录时抛出异常。由于某种原因,它不会在更新时抛出异常。