我有一个可能通过简单的旧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
- 编辑 -
感谢艾萨克的回答,以下是修改后的代码:
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
答案 0 :(得分:3)
GetOriginalEntityState(T实体) - 可能是您正在寻找的。如果您将其从上下文加载的实体传递给它,则返回上下文中保存的实体的原始版本。如果你传递一个新实体(或者我认为一个根本没有从该上下文中获取),它将返回null。
var context = new DataClasses1DataContext();
var person = context.Person.First();
var isAttachedToContext = context.Person.GetOriginalEntityState(person) != null; // returns true
var isNewEntityAttachedToContext = context.Peoples.GetOriginalEntityState(new Person()) != null; // returns false
道歉 - 答案在C#中,但我希望你能得到主旨!