在执行可能改变它的submitchanges操作后,是否必须刷新表示视图/表行的LINQ对象?

时间:2010-05-15 21:52:47

标签: c# linq .net-3.5

在执行可能改变它的submitchanges操作后,是否必须刷新表示视图/表行的LINQ对象?

假设我有

Event _event = new Event
{
someproperty = "this";
};

DataContext.Events.InsertOnSubmit(_event);

DataContext.SubmitChanges();

//some operations

_event.someproperty = "that";
DataContext.SubmitChanges();

让我们在一些操作中添加一个不同的线程,使用不同的DataContext实例,可能会更改相同的_event并提交它。

我有时会得到一个例外,说该行无法找到或已更改。有没有办法解决这个问题而不必重新选择_event?

2 个答案:

答案 0 :(得分:2)

我想你使用Linq的乐观并发。这意味着在更新数据库中的对象时,update语句会检查该行是否在此期间未更改。

如果另一个进程在对象的初始读取(或创建)与更新之间更改了DB中的对象,Linq将抛出 ChangeConflictException 。您可以捕获此异常并处理冲突(通过从DB重新加载对象或覆盖DB值)。

此处有更多详情:http://msdn.microsoft.com/en-us/library/bb399373%28v=VS.90%29.aspx

您的代码可能类似于:

try
{
_event.someproperty = "that";
DataContext.SubmitChanges();
}

catch (ChangeConflictException e)
{
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        // All database values overwrite current values.
        occ.Resolve(RefreshMode.OverwriteCurrentValues);
    }
}

有几种刷新模式,它实际上取决于您希望应用程序的行为方式。 请在以下答案中找到更多详细信息:

答案 1 :(得分:1)

如果实体位于同一个DataContext中,则不会,但如果您有其他Datacontexts访问数据(例如来自其他进程),那么在尝试提交之前需要注意并刷新。