EF 4: проблемы с пониманием DetectChanges при использовании POCO (без самоотслеживания ObjectContext)

Интересно, может ли кто-нибудь мне помочь?

У меня возникают проблемы с пониманием того, почему мне нужно выдавать DetectChanges для моих объектов POCO (не прокси).

Конечно, у меня есть эта строка, чтобы гарантировать, что прокси не будут возвращены.

   context.ObjectStateManager.GetObjectStateEntry(order).State

И, проводя некоторые исследования, оказывается, что если мне нужно проверить «состояние» объекта, мне нужно выпустить detechChanges. Но зачем мне проверять состояние объекта?

В основном я отправляю свою сущность POCO методу, который СОХРАНЯЕТ данные в новый ObjectContext (я создаю и уничтожаю ObjectContext для каждого метода)

Следовательно, у меня возникают проблемы с пониманием того, почему мне нужно отслеживать ObjectContext или быть в курсе изменений?

Это потому, что если он не знает, не будет ли спасен?

Может быть, я пропустил информацию, но похоже, что если я использую существующий ObjectContext (который я не создаю и уничтожаю каждый раз), то обеспечение того, чтобы ObjectContext знал, было бы полезно, но в противном случае нет?

Итак, в 1 методе я обновляю объект, создавая новый контекст данных, сохраняя его в БД и уничтожая ObjectContext . Следовательно, я не использую 2 метода: 1 метод для отправки обновления или новой записи, а затем другой метод для СОХРАНЕНИЯ.

Я был бы очень признателен за любые быстрые объяснения того, зачем это нужно?

заранее спасибо


person Martin    schedule 10.10.2010    source источник


Ответы (1)


Ваш вопрос немного сбивает с толку. Вы пишете о Entity Framework, но используете DataContext, связанный с LinqToSql.

Поведение зависит от того, как вы используете ObjectContext. Когда вы загружаете объект POCO из базы данных, ObjectContext сохраняет его экземпляр во внутренней карте удостоверений. По умолчанию POCO не использует никакого отслеживания изменений. Когда вы сохраняете этот объект POCO в тот же экземпляр ObjectContext, он внутренне вызывает DetectChanges для сравнения текущего состояния объекта с сохраненным состоянием. Это сравнение определяет, какие столбцы должны быть обновлены. Внутренний вызов DetectChanges — это поведение по умолчанию, которое можно отключить, поэтому вам придется вызывать этот метод вручную.

В вашем сценарии вы не используете один и тот же экземпляр ObjectContext. В этом случае вам сначала нужно прикрепить сущность POCO к ObjectContext. MSDN строго говорит, что при присоединении объект помечен как неизмененный. По этой причине вы должны сказать ObjectContext, что объект изменился. Вы можете сделать это для целого объекта или вы можете точно определить, какое properties изменились, но вы должны сделать это вручную = вы должны где-то хранить эту информацию (сущности самоотслеживания могут помочь вам в этом, но у них есть другие недостатки).

person Ladislav Mrnka    schedule 11.10.2010
comment
Спасибо ..., да .. извините, я сделал опечатку .. его объектный контекст, а не контекст данных :-) - person Martin; 11.10.2010
comment
Я обновил свой вопрос с исправленной опечаткой. Спасибо. Может быть, мне следует использовать тот же ObjectContext? У меня есть шаблон репозитория (класс)... и я создаю новый ObjectContext для каждого метода, окруженного оператором Using, чтобы он создавался и уничтожался. Может быть, мне следует создавать его как переменную уровня класса.. следовательно, он создается когда я создаю экземпляр класса hte (репозиторий) и уничтожаю его, когда экземпляр больше не существует? Как вы думаете, это лучший путь вперед.??? Я читал, что сохранение ObjectCOntext не является хорошей идеей??? - person Martin; 11.10.2010
comment
Это зависит от типа приложения и того, как вы используете репозиторий. Сохранение ObjectContext в течение длительного времени не является хорошей идеей, за исключением некоторых сценариев в приложениях WinForm или WPF. Но поддерживать ObjectContext для одного веб-запроса вполне нормально. Проверьте мой другой ответ, почему долгоживущие и общие контексты не являются хорошей идеей: структура и пул соединений"> stackoverflow.com/questions/3653009/ - person Ladislav Mrnka; 11.10.2010
comment
Как насчет того, чтобы при создании другого контекста перезагрузить исходный объект, а затем вызвать context.ApplyCurrentValues()? - person Piotr Perak; 11.11.2011