使用Linq-to-SQL更新记录

时间:2013-05-04 20:42:42

标签: 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.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?我已经使用调试器,数据一直持续整个过程,包括我正在尝试进行的更改。

2 个答案:

答案 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()时出错。