如何检查Linq-to-SQL对象是否已附加到DataContext?

时间:2011-06-27 13:39:21

标签: vb.net linq-to-sql

我有一个可能通过简单的旧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

1 个答案:

答案 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#中,但我希望你能得到主旨!