8

我做我的查询...

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

当它点击提交更改时,它会抛出该行未找到或已更改的异常。我是唯一使用它的人,因此访问数据库或锁定没有其他冲突。为什么会抛出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 条记录。

我已经做过很多次了,而且效果很好。我发现的每一个例子都正是我所拥有的。

4

2 回答 2

3

也许你在不同的环境下工作?尝试使用封装它

using (myContext ctx = new myContext())
{
    var user = ctx.users.first();  
    user.name="blah";
    ctx.SubmitChanges();
}
于 2013-05-04T20:50:46.927 回答
0

很多时候,如果您查看 Linq-to-SQL 生成的实际 SQL,您会发现它非常热衷于匹配您最初检索的数据库行。想象一下,您有一个包含 ID(PK)、A、B、C 列的表。您会认为,如果您为一行更新了列 C,那么使用匹配的主键更新该行就足够了。但经常发生的是,Linq-to-SQL 也在尝试匹配列 A 和 B。通常情况下,这很好。除非您有来自多线程或多进程的并发写入,并且其他内容会修改您尝试更新的记录的 A 或 B 列。然后你得到这些 System.Data.Linq.ChangeConflictException: Row not found or changed。在数据上下文中调用 SubmitChanges() 时出错。

于 2016-10-31T18:20:37.233 回答