使用Linq-to-SQL更新记录

本文关键字:新记录 更新 Linq-to-SQL 使用 | 更新日期: 2023-09-27 18:12:03

我做我的查询…

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条记录。

我已经这么做过很多次了,而且很有效。我找到的每一个例子都是我所拥有的。

使用Linq-to-SQL更新记录

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

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

通常,如果您查看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()时出现错误