使用Linq-to-SQL更新记录

9

我执行我的查询...

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

我已经做过很多次了,而且都成功了。我找到的每个示例都与我所遇到的情况完全一样。


你是否正在使用Entity Framework(如果是,那么是哪个版本)? - gunr2171
另外,你的所有表格都有主键吗?这包括你正在编辑的表格以及任何从外键引出的分支表格。 - gunr2171
您可能会遇到此错误,原因是您的某个字段在 Linq To SQL 设计器中与实际数据库中的不同。 - Obama
.NET Framework 4,是的,所有表都有主键和适当的外键。此查询仅针对1个表进行,该表中没有任何外键。这是我的基本表之一。 - Andy Link
你使用 SubmitChanges 而不是 SaveChanges 有什么原因吗?另外,你使用的 Entity 框架版本是什么? - gunr2171
2个回答

4
也许你正在处理不同的上下文?尝试使用封装来解决。
using (myContext ctx = new myContext())
{
    var user = ctx.users.first();  
    user.name="blah";
    ctx.SubmitChanges();
}

0

在看Linq-to-SQL生成的实际SQL时,经常会发现它对于匹配最初检索的数据库行非常过度热衷。想象一下,您有一个具有列ID(PK),A,B,C的表。您可能认为,如果更新了一行的列C,则应该足以更新具有匹配主键的行。但是,经常发生的情况是,Linq-to-SQL也尝试匹配列A和B。通常那没关系,除非您有并发写入,无论是多线程还是多进程,并且其他东西修改要更新的记录的列A或B。然后,当您在数据上下文中调用SubmitChanges()时,就会出现“System.Data.Linq.ChangeConflictException:未找到或更改行”的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接