C# 从数据库中删除记录时如何将Linq解析为SQL ChangeConflictException

C# 从数据库中删除记录时如何将Linq解析为SQL ChangeConflictException,c#,winforms,linq-to-sql,C#,Winforms,Linq To Sql,我目前正在尝试解决一个问题,我们的应用程序偶尔抛出一个ChangeConflictException,并显示以下错误消息:无法刷新指定的对象。数据库中不再存在该对象。 我可以通过执行以下步骤再现此错误消息。首先,我们加载一个表单,该表单显示服务工单的详细信息。与此表单关联的WorkOrder对象具有许多关联(例如,客户、作业、作业项、地址等)。在表单关闭之前,数据上下文保持打开状态。接下来,如果在加载此表单时删除了其中一个关联,则当用户尝试保存与表单关联的工作订单时,将导致ChangeConfl

我目前正在尝试解决一个问题,我们的应用程序偶尔抛出一个
ChangeConflictException
,并显示以下错误消息:
无法刷新指定的对象。数据库中不再存在该对象。

我可以通过执行以下步骤再现此错误消息。首先,我们加载一个表单,该表单显示服务工单的详细信息。与此表单关联的WorkOrder对象具有许多关联(例如,客户、作业、作业项、地址等)。在表单关闭之前,数据上下文保持打开状态。接下来,如果在加载此表单时删除了其中一个关联,则当用户尝试保存与表单关联的工作订单时,将导致ChangeConflictException,因为会话在缓存中有一个id在数据库中不再存在的对象


我理解为什么会出现这种异常,但我想知道处理这种情况的最佳实践是什么。还有,有没有一种方法可以识别数据库中不再存在的对象?

我在Asp.net/vb.net中遇到过类似的问题

Dim db As New MyDataContext
MyObject.Detach()
db.MyTable.Attach(MyObject)
db.Refresh(RefreshMode.KeepCurrentValues, MyObject)'Error Happens Here
db.SubmitChanges()
帮助我的解决方案

Dim db As New MyDataContext
MyObject.Detach()
db.MyTable.Attach(MyObject)
 'Commented Out the Line
db.SubmitChanges()
Refresh()方法不会从数据库中检索新记录

我不完全确定这是为什么——这只是LINQtoSQL产品团队做出的选择之一(可能有充分的理由)。这可能与刷新方法

主要用于乐观并发冲突解决1 要获取新输入的记录,您需要:

在同一DataContext上重新发出新查询 创建DataContext的新实例 选择哪一个取决于上下文(没有双关语)。需要记住的是Linq to SQL DataContext的预期工作单元性质和DataContext的预期短生命周期

希望能有帮助