Я нахожусь в процессе разработки приложения WPF, использующего Entity Framework (.NET 3.5). Он обращается к сущностям в нескольких местах повсюду. Меня беспокоит согласованность всей заявки в отношении сущностей. Должен ли я создавать отдельные контексты в своих разных представлениях или я должен (и это хороший способ сделать это) создавать единый контекст, к которому можно получить глобальный доступ?
Например, моя модель сущности состоит из трех разделов: отгрузки (с дочерними пакетами и дополнительным дочерним содержимым), компании / контакты (с дочерними адресами и телефонами) и спецификации дисков. Представления «Отгрузки» и «EditShipment» обращаются к DiskSpecs, а «Options» управляет DiskSpecs («Создать», «Редактировать», «Удалить»). Если я редактирую DiskSpec, у меня должно быть что-то в ShipmentsView для получения последних спецификаций, если у меня есть отдельные контексты, верно?
Если безопасно иметь один общий контекст, из которого остальная часть приложения извлекает свои объекты, тогда я думаю, что это путь. Если так, то где этот экземпляр будет помещен? Я использую VB.NET, но я могу перевести с C # довольно хорошо. Любая помощь будет оценена.
Я просто не хочу, чтобы одно из тех приложений, где пользователь должен был нажать десятки раз, чтобы получить новые данные, перезагружать в разных частях приложения.
Обновление:
ОК, поэтому я изменил свое приложение следующим образом:
- Все контексты создаются с помощью блоков, чтобы избавиться от них после того, как они больше не нужны.
- При загрузке все объекты извлекаются из контекста до его удаления.
- Новое свойство в MainViewModel (ContextUpdated) вызывает событие, на которое подписываются все другие ViewModel, для которого выполняется этот метод ViewModels RefreshEntities.
- После реализации этого я начал получать сообщения о том, что на сущность может ссылаться только один ChangeTracker за раз. Поскольку я не мог выяснить, какой контекст все еще ссылается на сущность (не должно быть никакого контекста, верно?), Я привел объект как IEntityWithChangeTracker и установил в SetChangeTracker ничего (Null).
Это позволило решить текущую проблему:
Когда я обнуляю changeTracker на сущности, а затем присоединяю его к контексту, он теряет свое измененное состояние и не обновляется в базе данных. Однако если я не обнуляю трекер изменений, я не могу присоединиться У меня есть свой собственный код отслеживания изменений, так что это не проблема.
Мой новый вопрос: как ты должен это делать? Хороший пример запроса Entity и кода сохранения сущности будет иметь большое значение, потому что я бьюсь головой, пытаясь заставить работать то, что я когда-то считал простой транзакцией.