C# 使用Linq到SQL更新记录

C# 使用Linq到SQL更新记录,c#,linq-to-sql,C#,Linq To Sql,我做我的查询 var result = from u in tdc.tblUsers where u.UserID == userID select u; 然后我改变我想要的值: foreach (tblUsers u in result) { //change values (and no im not changing the primary key or foreign keys) } 然后我提交更改 tdc.SubmitC

我做我的查询

var result = from u in tdc.tblUsers
             where u.UserID == userID
             select u;
然后我改变我想要的值:

foreach (tblUsers u in result)
{
     //change values (and no im not changing the primary key or foreign keys)
}
然后我提交更改

tdc.SubmitChanges();
当点击SubmitChanges时,它抛出一个异常,即该行未找到或已更改。我是唯一使用此功能的人,因此访问数据库或锁定没有其他冲突。为什么它会抛出
ChangeConflictException
?我已经使用了调试器,数据在整个过程中一直保持不变,包括我试图进行的更改

我以前也试过这种方法,但也犯了同样的错误

tblUsers result = (from u in tdc.tblUsers
                   where u.UserID == userID
                   select u).Single();
result.Address = address;
result.Phone = phone;
tdc.SubmitChanges();
由于
UserID
是主键,因此它只能通过此查询检索1条记录


我已经做过很多次了,而且效果很好。我找到的每一个例子都和我的一模一样。

也许你的工作环境不同?尝试使用

using (myContext ctx = new myContext())
{
    var user = ctx.users.first();  
    user.name="blah";
    ctx.SubmitChanges();
}

通常,如果您查看linqtosql生成的实际SQL,就会发现它对匹配最初检索到的数据库行过于热心。假设您有一个具有列ID(PK)、a、B、C的表。您可能会认为,如果您为一行更新了列C,那么使用匹配的主键更新该行就足够了。但经常发生的是LINQtoSQL也在尝试匹配列A和列B。通常情况下,这很好。除非您有来自多线程或多进程的并发写入,并且其他内容会修改您尝试更新的记录的A列或B列。然后您将得到以下System.Data.Linq.ChangeConflictException:未找到或更改的行。在数据上下文上调用SubmitChanges()时出错。

是否使用实体框架(如果是,是什么版本)?此外,是否所有表都有主键。这包括您正在编辑的表和外键的任何分支表。出现此错误可能是因为您的一个字段在Linq To SQL设计器和实际数据库中有不同的内容。.NET Framework 4和yes所有表都有主键和正确的外键。此查询只针对1个表,该表中没有任何外键。这是我的一个基表。您使用
SubmitChanges
而不是
SaveChanges
的原因是什么?另外,您使用的是什么版本的实体框架?