Я использую сущности самопроверки в Entity Framework 4. После загрузки сущностей в память функция StartTracking () ДОЛЖНА быть вызвана для каждой сущности. Затем вы можете изменить свой граф сущностей в памяти без каких-либо DB-операций. Когда вы закончите с изменениями, вы вызываете метод расширения контекста «ApplyChanges (rootOfEntityGraph)» и SaveChanges (). Так что ваши модификации сохраняются. Теперь вам нужно снова начать отслеживать все объекты на графике. Две подсказки / идеи, которые я использую в данный момент:
1.) Вызывать StartTracking () в начале для каждого объекта
Я использую интерфейс IWorkspace для абстрагирования ObjectContext (упрощает тестирование -> см. Реализацию OpenSource bbv.DomainDrivenDesign в sourceforge). Они также используют QueryableContext. Поэтому я создал еще одну конкретную реализацию Workspace и QueryableContext и перехватил процесс загрузки собственной реализацией IEnumerable. Когда потребитель рабочей области выполняет запрос, который он получает с помощью CreateQuery (), мой перехваченный объект IEnumerable регистрирует обработчик событий в ChangeTracker контекста. В этом обработчике событий я вызываю StartTracking () для каждой сущности, загруженной и добавленной в контекст (не работает, если вы загружаете объекты с помощью NoTrakcing, потому что в этом случае объекты не добавляются в контекст, а обработчик событий не будет быть уволенным). После перечисления в самодельном итераторе обработчик события в ObjectStateManager отменяется.
2.) Вызвать StartTracking () после ApplyChanges () / SaveChanges ()
В реализации рабочей области я запрашиваю контекстный ObjectStateManager для измененных сущностей, то есть:
var AddedEntities = this.context.ObjectStateManager.GetObjectStateEntries (EntityState.Added);
-> аналогично для модифицированных объектов
приведите их к IObjectWithChangeTracker и вызовите метод AcceptChanges () для самой сущности. Это снова запустит средство отслеживания изменений объекта.
Для моего проекта у меня те же обязательные пункты, что и у вас. Я играл с EF 3.5 и не нашел удовлетворительного решения. Но новая способность самостоятельного отслеживания сущностей в EF 4, кажется, соответствует моим требованиям (насколько я исследовал функциональность).
Если вам интересно, я пришлю вам мой "шип" -проект.
У кого-нибудь есть альтернативное решение? Мой проект - это серверное приложение, которое хранит объекты в памяти для быстрых операций, в то время как изменения также должны быть сохранены (без обращения к БД). В некоторых точках кода графы объектов помечаются как удаленные / прекращенные и удаляются из контейнера в памяти. С помощью описанного выше решения я могу повторно использовать сгенерированную модель из EF, и мне больше не придется самому кодировать и оборачивать все объекты. Сгенерированный код для объектов самоконтроля возникает из шаблонов T4, которые можно очень легко адаптировать.
Большое спасибо за другие идеи / критику