Учебники

Entity Framework — Жизненный цикл

Срок действия контекста начинается, когда экземпляр создается, и заканчивается, когда экземпляр удаляется или собирается мусором.

  • Время жизни контекста — это очень важное решение, которое мы принимаем при использовании 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 и т. Д., Контекст используется для каждой формы / диалога / страницы.

Поскольку мы не хотим, чтобы контекст был единичным для нашего приложения, мы будем им распоряжаться при переходе от одной формы к другой.

Таким образом, мы получим много возможностей контекста и не будем страдать от последствий длительных контекстов.