【问题标题】:How do I check whether a Linq-to-SQL object is already attached to a DataContext?如何检查 Linq-to-SQL 对象是否已附加到 DataContext?
【发布时间】: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


    【解决方案1】:

    GetOriginalEntityState(T entity) on Table - 可能是您正在寻找的。如果您将一个从上下文加载的实体传递给它,它会返回上下文中保存的实体的原始版本。如果你向它传递一个新实体(或者我相信一个根本不是来自该上下文的实体),它会返回 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# 中,但我希望你明白要点!

    【讨论】:

    • 太不可思议了,谢谢!完美运行。当成语相同时,C# 的答案也没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多