我已经多次这样做了,但它已经奏效了。
我发现的每个例子都是我的......
我的查询......
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();
我之前也尝试过这种方式并得到同样的错误
tblUsers result = (from u in tdc.tblUsers
where u.UserID == userID
select u).Single();
result.Address = address;
result.Phone = phone;
tdc.SubmitChanges();
由于UserID
是主键,因此只能使用此查询检索1条记录。
当它点击提交更改时,会抛出未找到或已更改行的异常。我是唯一一个使用它的人,因此访问数据库或锁定没有其他冲突。为什么它会抛出ChangeConflictException
?我已经使用调试器,数据一直持续整个过程,包括我正在尝试进行的更改。
答案 0 :(得分:3)
也许您使用不同的背景?尝试使用。
封装它 像这样using (myContext ctx = new myContext())
{
var user = ctx.users.first();
user.name="blah";
ctx.SubmitChanges();
}
答案 1 :(得分:0)
通常,如果你看一下Linq-to-SQL生成的实际SQL,你会发现它与你最初检索的数据库行匹配时真的过于热心了。假设您有一个包含列ID(PK),A,B,C的表。您可能会认为,如果您更新了一行C列,则应该使用匹配的主键更新该行。但经常发生的是Linq-to-SQL也试图匹配A列和B列。通常,这没关系。除非您有多个线程或多进程的并发写入,否则其他内容会修改您尝试更新的记录的A列或B列。然后你得到这些System.Data.Linq.ChangeConflictException:未找到或更改行。在数据上下文中调用SubmitChanges()时出错。