Если я избавлюсь от моего ObjectContext, мои объекты будут отделены? - PullRequest
9 голосов
/ 23 июня 2011

Другими словами, если я получаю сущности, а затем избавляюсь от моего ObjectContext, должен ли я явно отсоединять все мои сущности?

Ответы [ 3 ]

8 голосов
/ 23 июня 2011

Возможно, это зависит от значения Detach.Присоединенная сущность означает, что контекст знает о сущности и отслеживает ее изменения.Если вы располагаете контекстом, он больше не может отслеживать изменения, и сущность становится отсоединенной.Подобное имеет здесь реальное значение.

Если вы используете динамические прокси (POCO - динамическое отслеживание изменений или отложенная загрузка), сам прокси сохраняет внутреннюю обратную ссылку на контекст, но не реагирует на удаление контекста.Он по-прежнему сохраняет ссылку (кстати, это может быть источником некоторых неприятных утечек памяти).Это вызывает проблему в двух ситуациях:

  • Когда вы пытаетесь присоединить такую ​​сущность к другому контексту, возникает исключение, что сущность может отслеживаться только одним контекстом (несмотря на тот факт, что исходный контекст ужемертвых).
  • Когда вы пытаетесь получить доступ к свойству навигации, которое не было загружено с нетерпением, вы получите ObjectDisposedException, потому что прокси вызовет отложенную загрузку в удаленном контексте.

Единственный способ избежатьэто либо отключение динамических прокси, либо ручное отключение объекта перед удалением контекста.У этого есть еще один недостаток - отделение сущности разрывает отношения.

5 голосов
/ 23 июня 2011

Нет, вам не нужно вызывать detach на ваших сущностях.Однако, если вы сделаете что-то вроде:

var people = Context.Person.Where(p => p.FirstName == "John");

и затем избавитесь от своего контекста, люди сгенерируют исключение, потому что IEnumerable отложил выполнение.Выполнение этого:

var people = Context.Person.Where(p => p.FirstName == "John").ToList();

позволит вам по-прежнему использовать свой список людей.

Далее,

var john = Context.Person.FirstOrDefault(p => p.Id == 342);

будет работать после удаления контекста, потому что вы получиликонкретная сущность, а не перечисление.

2 голосов
/ 23 июня 2011

Ваши сущности отсоединяются после удаления контекста. Смотрите следующий пост:

Entity Framework несколько контекстов объектов

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