Как проверить, подключен ли объект Linq-to-SQL к DataContext? - PullRequest
0 голосов
/ 27 июня 2011

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

3 голосов
/ 27 июня 2011

GetOriginalEntityState (T entity) в Table -might- может быть тем, что вы ищете.Если вы передаете ему объект, который вы загрузили из контекста, он возвращает исходную версию объекта, содержащегося в контексте.Если вы передадите ему новую сущность (или я верю, что она просто не получена из этого контекста), она вернет ноль.

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 #, но я надеюсь, что вы понимаете суть!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...