Срок действия контекста начинается, когда экземпляр создается, и заканчивается, когда экземпляр удаляется или собирается мусором.
-
Время жизни контекста — это очень важное решение, которое мы принимаем при использовании ORM.
-
Контекст работает как кеш сущностей, поэтому он содержит ссылки на все загруженные сущности, которые могут очень быстро расти в потреблении памяти, а также могут вызывать утечки памяти.
-
На приведенной ниже диаграмме вы можете видеть верхний уровень рабочего потока данных из приложения в базу данных через контекст и наоборот.
Время жизни контекста — это очень важное решение, которое мы принимаем при использовании ORM.
Контекст работает как кеш сущностей, поэтому он содержит ссылки на все загруженные сущности, которые могут очень быстро расти в потреблении памяти, а также могут вызывать утечки памяти.
На приведенной ниже диаграмме вы можете видеть верхний уровень рабочего потока данных из приложения в базу данных через контекст и наоборот.
Жизненный цикл сущности
Жизненный цикл сущности описывает процесс, в котором сущность создается, добавляется, изменяется, удаляется и т. Д. Сущности имеют много состояний в течение своей жизни. Прежде чем посмотреть, как получить состояние объекта, давайте посмотрим, что такое состояние объекта. Состояние является перечислением типа System.Data.EntityState, которое объявляет следующие значения:
-
Добавлено: объект помечен как добавленный.
-
Удалено: объект помечен как удаленный.
-
Изменено: объект был изменен.
-
Без изменений: объект не был изменен.
-
Отдельно: сущность не отслеживается.
Добавлено: объект помечен как добавленный.
Удалено: объект помечен как удаленный.
Изменено: объект был изменен.
Без изменений: объект не был изменен.
Отдельно: сущность не отслеживается.
Изменения состояния в жизненном цикле сущности
Иногда состояние сущностей устанавливается автоматически контекстом, но оно также может быть изменено разработчиком вручную. Хотя все комбинации переключений из одного состояния в другое возможны, но некоторые из них не имеют смысла. Например, Добавлен объект в Удаленное состояние, или наоборот.
Давайте поговорим о разных состояниях.
Неизменное состояние
-
Когда объект не изменен, он привязан к контексту, но не был изменен.
-
По умолчанию объект, извлеченный из базы данных, находится в этом состоянии.
-
Когда объект присоединяется к контексту (с помощью метода Attach), он аналогичным образом находится в неизмененном состоянии.
-
Контекст не может отслеживать изменения объектов, на которые он не ссылается, поэтому, когда они присоединены, он предполагает, что они не изменены.
Когда объект не изменен, он привязан к контексту, но не был изменен.
По умолчанию объект, извлеченный из базы данных, находится в этом состоянии.
Когда объект присоединяется к контексту (с помощью метода Attach), он аналогичным образом находится в неизмененном состоянии.
Контекст не может отслеживать изменения объектов, на которые он не ссылается, поэтому, когда они присоединены, он предполагает, что они не изменены.
Отдельно стоящее государство
-
Detached — это состояние по умолчанию для вновь созданной сущности, поскольку контекст не может отслеживать создание какого-либо объекта в вашем коде.
-
Это верно, даже если вы создаете экземпляр объекта внутри блока using контекста.
-
Отключено — это даже состояние объектов, извлеченных из базы данных, когда отслеживание отключено.
-
Когда объект отсоединен, он не связан с контекстом, поэтому его состояние не отслеживается.
-
Его можно утилизировать, модифицировать, использовать в сочетании с другими классами или использовать любым другим способом, который вам может понадобиться.
-
Поскольку контекст не отслеживает его, он не имеет никакого значения для Entity Framework.
Detached — это состояние по умолчанию для вновь созданной сущности, поскольку контекст не может отслеживать создание какого-либо объекта в вашем коде.
Это верно, даже если вы создаете экземпляр объекта внутри блока using контекста.
Отключено — это даже состояние объектов, извлеченных из базы данных, когда отслеживание отключено.
Когда объект отсоединен, он не связан с контекстом, поэтому его состояние не отслеживается.
Его можно утилизировать, модифицировать, использовать в сочетании с другими классами или использовать любым другим способом, который вам может понадобиться.
Поскольку контекст не отслеживает его, он не имеет никакого значения для Entity Framework.
Добавленное состояние
-
Когда объект находится в состоянии «Добавлен», у вас есть несколько вариантов. На самом деле, вы можете только отделить его от контекста.
-
Естественно, даже если вы изменяете какое-либо свойство, состояние остается добавленным, поскольку перемещение его в значение «Изменено», «Без изменений» или «Удалено» не имеет смысла.
-
Это новый объект, который не соответствует строке в базе данных.
-
Это фундаментальная предпосылка для нахождения в одном из этих состояний (но это правило не применяется контекстом).
Когда объект находится в состоянии «Добавлен», у вас есть несколько вариантов. На самом деле, вы можете только отделить его от контекста.
Естественно, даже если вы изменяете какое-либо свойство, состояние остается добавленным, поскольку перемещение его в значение «Изменено», «Без изменений» или «Удалено» не имеет смысла.
Это новый объект, который не соответствует строке в базе данных.
Это фундаментальная предпосылка для нахождения в одном из этих состояний (но это правило не применяется контекстом).
Модифицированное состояние
-
Когда сущность изменяется, это означает, что она была в неизмененном состоянии, а затем некоторые свойства были изменены.
-
После того, как объект входит в состояние «Изменено», он может перейти в состояние «Отсоединено» или «Удалено», но не может вернуться к состоянию «Неизменен», даже если вы вручную восстановите исходные значения.
-
Он даже не может быть изменен на Добавленный, если вы не отсоедините и не добавите объект в контекст, потому что строка с этим идентификатором уже существует в базе данных, и вы получите исключение времени выполнения при сохранении ее.
Когда сущность изменяется, это означает, что она была в неизмененном состоянии, а затем некоторые свойства были изменены.
После того, как объект входит в состояние «Изменено», он может перейти в состояние «Отсоединено» или «Удалено», но не может вернуться к состоянию «Неизменен», даже если вы вручную восстановите исходные значения.
Он даже не может быть изменен на Добавленный, если вы не отсоедините и не добавите объект в контекст, потому что строка с этим идентификатором уже существует в базе данных, и вы получите исключение времени выполнения при сохранении ее.
Удаленное состояние
-
Сущность переходит в состояние «Удалено», поскольку она не была изменена или изменена, а затем был использован метод DeleteObject.
-
Это наиболее ограничительное состояние, потому что бессмысленно переходить из этого состояния в любое другое значение, кроме Detached.
Сущность переходит в состояние «Удалено», поскольку она не была изменена или изменена, а затем был использован метод DeleteObject.
Это наиболее ограничительное состояние, потому что бессмысленно переходить из этого состояния в любое другое значение, кроме Detached.
Оператор using, если вы хотите, чтобы все ресурсы, которыми управляет контекст, располагались в конце блока. Когда вы используете оператор using , компилятор автоматически создает блок try / finally и вызывает dispose в блоке finally.
using (var context = new UniContext()) { var student = new Student { LastName = "Khan", FirstMidName = "Ali", EnrollmentDate = DateTime.Parse("2005-09-01") }; context.Students.Add(student); context.SaveChanges(); }
При работе с длительным контекстом учитывайте следующее:
-
Когда вы загружаете в память больше объектов и их ссылок, потребление памяти контекстом может быстро возрасти. Это может вызвать проблемы с производительностью.
-
Не забудьте избавиться от контекста, когда он больше не требуется.
-
Если исключение приводит к тому, что контекст находится в неисправимом состоянии, все приложение может завершиться.
-
Вероятность столкнуться с проблемами, связанными с параллелизмом, увеличивается с увеличением разрыва между временем запроса и обновления данных.
-
При работе с веб-приложениями используйте экземпляр контекста для каждого запроса.
-
При работе с Windows Presentation Foundation (WPF) или Windows Forms используйте экземпляр контекста для каждой формы. Это позволяет вам использовать функции отслеживания изменений, которые предоставляет контекст.
Когда вы загружаете в память больше объектов и их ссылок, потребление памяти контекстом может быстро возрасти. Это может вызвать проблемы с производительностью.
Не забудьте избавиться от контекста, когда он больше не требуется.
Если исключение приводит к тому, что контекст находится в неисправимом состоянии, все приложение может завершиться.
Вероятность столкнуться с проблемами, связанными с параллелизмом, увеличивается с увеличением разрыва между временем запроса и обновления данных.
При работе с веб-приложениями используйте экземпляр контекста для каждого запроса.
При работе с Windows Presentation Foundation (WPF) или Windows Forms используйте экземпляр контекста для каждой формы. Это позволяет вам использовать функции отслеживания изменений, которые предоставляет контекст.
Эмпирические правила
Веб-приложения
-
В настоящее время общепринятой и лучшей практикой является то, что для веб-приложений контекст используется для каждого запроса.
-
В веб-приложениях мы имеем дело с запросами, которые очень короткие, но содержат все серверные транзакции, поэтому они имеют надлежащую продолжительность для контекста.
В настоящее время общепринятой и лучшей практикой является то, что для веб-приложений контекст используется для каждого запроса.
В веб-приложениях мы имеем дело с запросами, которые очень короткие, но содержат все серверные транзакции, поэтому они имеют надлежащую продолжительность для контекста.
Настольные приложения
Для настольных приложений, таких как Win Forms / WPF и т. Д., Контекст используется для каждой формы / диалога / страницы.
Поскольку мы не хотим, чтобы контекст был единичным для нашего приложения, мы будем им распоряжаться при переходе от одной формы к другой.
Таким образом, мы получим много возможностей контекста и не будем страдать от последствий длительных контекстов.