2011-06-27 3 views
0

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

ответ

3

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

Смежные вопросы