Я знаю, что этот вопрос задан и обсужден много (например, Here и Here и этот Article). Тем не менее, я все еще чувствую смущение. Я знаю, что DbContext
s не должен проживать в течение всего срока службы приложения, я знаю, что они должны использоваться для каждой формы (окна) или для презентатора. Проблема в том, что у меня нет форм или презентаторов. У меня есть одна форма (окно) со многими моделями просмотров, некоторые из которых живут в течение всего приложения, и почти все мои модели просмотров зависят от DbContext
(приложение LOB, WPF, MVVM, Sql Server CE).
Мое решение состоит в том, чтобы скрыть DbContext
за фабрикой, которая вводится во все модели просмотра, которым необходим доступ к DbContext
, и эти модели просмотра создают/удаляют DbContext
, когда их соответствующее представление загружается/выгружается. Я хотел бы знать, есть ли у этого решения какие-либо проблемы или есть лучшее решение, которое вы могли бы посоветовать?Управление временем жизни DbContext в толстом WPF-клиенте
ответ
Я, как правило, выкладываю свои проекты следующим образом;
1) Уровень представления:
Contains my Views and ViewModels
2) Бизнес-слой:
Contains my business logic
3) Уровень данных:
Contains my models
Мой слой «Презентация» вызывает бизнес-уровень для заполнения локальных копий (хранимых в ViewModel) данных, которые я хочу использовать в моей модели ViewModel/View.
Это достигается с помощью инструкции Using, что-то вроде;
Using DBContext As Entities = ConnectToDatabase()
Dim clsApprovalTypes As New Repositories.clsApprovalTypesRepository(DBContext)
dbResults = clsApprovalTypes.GetRecords()
End Using
Return dbResults
Здесь я просто передать в контексте в хранилище после того, как данные были возвращены, «Конец Использование» распорядится моей контекста.
Чтобы обновить контекст с изменениями, внесенными в мой ViewModel/View, я использую подпрограмму AddEdit, которая принимает запись, и при необходимости обновляет/добавляет в контекст, используя аналогичную методологию выше, что-то вроде;
Using DBContext As CriticalPathEntities = ConnectToDatabase()
Dim clsApprovalTypes As New Repositories.clsApprovalTypesRepository(DBContext)
clsApprovalTypes.AddEditRecord(ApprovalTypeToSave)
Try
clsApprovalTypes.SaveData()
Catch ex As Exception
Return ex
End Try
End Using
Где моя процедура AddEdit - это что-то типа;
SavedRecord = New ApprovalType 'Store the Saved Record for use later
Dim query = From c In DBContext.ApprovalTypes
Where c.ApprovalType_ID = RecordToSave.ApprovalType_ID
Select c
If query.Count > 0 Then
SavedRecord = query.FirstOrDefault
End If
'
' Use Reflection here to copy all matching Properties between the Source Entity
' and the Entity to be Saved...
'
SavedRecord = Classes.clsHelpers.CopyProperties(RecordToSave, SavedRecord)
If query.Count = 0 Then
Try
DBContext.ApprovalTypes.Add(SavedRecord)
Catch ex As EntityException
Return ex
End Try
End If
Я написал немного больше о некоторых из этого здесь;
- 1. Управление временем жизни контекста в инфраструктуре Entity
- 2. Управление временем жизни - диаграмма последовательности - корпоративный архитектор
- 3. Управление временем жизни процесса Я не контролирую
- 4. Управление базой данных и временем жизни соединения
- 5. Управление временем жизни объекта MongoDB в веб-приложении
- 6. EF ObjectContext, Service and Repository - Управление временем жизни контекста.
- 7. Управление временем жизни функций-членов, связанных `std :: bind`
- 8. Фасоль со временем для жизни
- 9. Как управлять временем жизни объекта в MVVM?
- 10. Вложение переменных со временем жизни в struct
- 11. Управление DbContext в приложении WPF
- 12. Управление временем скрипта asp
- 13. Управление временем выполнения Hystrix
- 14. Управление временем выполнения
- 15. Управление автономным временем в Android
- 16. Кэш Python со временем для жизни
- 17. Javascript, объект с установленным временем жизни?
- 18. Как вы управляете временем жизни сервера Rook?
- 19. Как управлять экземпляром с определенным временем жизни
- 20. Перечисление одноразовых предметов, отслеживаемых временем жизни Autofac
- 21. Как справиться с временем жизни возвращаемого указателя?
- 22. Очередь сообщений со временем для жизни
- 23. Java метода с истекшим временем жизни объектов
- 24. Как выбрать заголовок с последним временем жизни?
- 25. , владеющий родственными полями и временем жизни
- 26. Запуск внешнего процесса со временем для жизни
- 27. Как управлять временем жизни типа «кратчайший»?
- 28. Возвращение ссылки с временем жизни я
- 29. Matlab: извлечение строк с конкретным временем жизни
- 30. Как реализовать FromStr с конкретным временем жизни?
Спасибо за подробное объяснение, от того, что я вижу в вашем методе, вы используете контекст каждого метода и располагающие, когда метод закончен, но я думаю, что это противоречит тому, что в статье я связан слишком советы и называет это микроиспользованием контекста вместо того, чтобы позволить контексту жить по методу, позволить ему жить на одного ведущего. –
Да, я основывал свой ответ на рекомендации Microsoft, приведенной здесь ... http://msdn.microsoft.com/en-gb/library/cc853327.aspx, в которой рекомендуется, чтобы Контекст был заключен в оператор 'Using' , – PGallagher
Ваша рекомендация верна, и я буду использовать инструкцию «using» в приложениях MVC внутри метода действия контроллера или внутри метода службы WCF. Plus, ваша ссылка говорит, что если есть привязка, и контекст должен жить для длительность привязки, тогда вы должны утилизировать его вручную. Поэтому я думаю, что это моя ситуация, поэтому я буду рассматривать это как ответ, если кто-то другой не придумает другую идею. –