У меня есть объект, который, возможно, был задуман через простой старый DataContext
, или может быть просто обновлен только с его набором свойств .ID
. Невозможно точно знать. Я ищу, чтобы переместить весь объект из того, что находится в базе данных. Если объект был обновлен, я могу вызвать .Attach()
на объект таблицы и обновить из контекста данных без проблем. Но, если объект уже был завышен из DataContext, я получаю ошибку: «Не удается присоединить сущность, которая уже существует». Не существует поля timestamp или что-то в этом роде - просто цельный первичный ключ, используемый для контроля регидратации. Я хотел бы знать, есть ли способ условно подключиться. Вот код - это работает, как я хочу, но это кажется хак способом идти о нем:Как проверить, привязан ли объект 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
- EDIT -
Благодаря Исаакиевскому ответ, вот пересмотренный код:
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
Это невероятно, спасибо! Работает отлично. Нет проблем с ответом на C#, если одинаковые идиомы. – mattmc3