【发布时间】:2011-06-27 22:39:45
【问题描述】:
我有一个对象,它可能是通过一个普通的旧 DataContext 膨胀的,或者可能只是用它的 .ID 属性集进行了新的处理。没有办法确定。我希望从数据库中的任何内容中重新水化整个对象。如果对象是新的,我可以在表对象上调用.Attach() 并从数据上下文刷新而不会遇到任何问题。但是,如果对象已经从 DataContext 膨胀,我会收到错误:“无法附加已经存在的实体。”。没有时间戳字段或类似的东西——只有一个整数主键用于控制补液。我想知道是否有条件附加的方法。这是代码 - 它按照我想要的方式工作,但这似乎是一种骇人听闻的方式:
' myDC is a shared instance of a vanilla DataContext...
' myObj is an instance of a linqed-up `SomeLinqObject`
Dim tbl = myDC.GetTable(Of SomeLinqObject)()
Try
tbl.Attach(myObj) ' <-- Wish I could just TryAttach() here!
Catch ex As Exception
If ex.Message = "Cannot attach an entity that already exists." Then
' Do nothing
Else
Throw
End If
End Try
myDC.Refresh(RefreshMode.OverwriteCurrentValues, myObj) ' Rehydrate
-- 编辑--
感谢 Isaac 的回答,这是修改后的代码:
Dim tbl = myDC.GetTable(Of SomeLinqObject)()
Dim isAttached = (tbl.GetOriginalEntityState(myObj) IsNot Nothing)
If Not isAttached Then tbl.Attach(myObj)
myDC.Refresh(RefreshMode.OverwriteCurrentValues, myObj) ' Rehydrate
【问题讨论】:
标签: vb.net linq-to-sql