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

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

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

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

   context.ObjectStateManager.GetObjectStateEntry(order).State

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

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

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

Это потому, что если его не знают, если не будут сохранены?

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам