2011-06-27 47 views
0

我有一个物体可能已经通过旧的DataContext进行了充气,​​或者可能刚刚通过.ID属性集进行了新增。无法确切知道。我正在寻找从数据库中的任何东西重新水化整个对象。如果对象是新建的,我可以在表格对象上调用.Attach(),并从数据上下文中轻松刷新。但是,如果该对象已经从DataContext夸大,我会收到错误:“无法附加已存在的实体。”没有时间戳字段或类似的东西 - 只是一个整数主键用于控制补液。我想知道是否有条件附加的方法。下面的代码 - 它的工作原理我希望它的方式,但是这似乎是一个hackish的方式去了解它:如何检查Linq-to-SQL对象是否已附加到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 

回答

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#中,但我希望你能得到要点!

+0

太不可思议了,谢谢!完美的作品。当成语相同时,C#答案没有问题。 – mattmc3

相关问题