У меня есть объект, который, возможно, был накачан простым старым 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