EF4 - возможно ли увидеть, какой ObjectContext отслеживает конкретную сущность? - PullRequest
2 голосов
/ 21 октября 2011

РЕДАКТИРОВАТЬ: Я хотел бы получить окончательный ответ о том, можно ли определить, какой ObjectContext отслеживает какие объекты. Есть ли конкретное свойство, которое говорит: «Entity x принадлежит этому контексту?»

Ответы [ 2 ]

2 голосов
/ 02 мая 2012

Если у вас есть ссылки на все возможные ObjectContext экземпляры, вы можете определить, к какому из них прикреплен данный экземпляр сущности, вызвав их .ObjectStateManager.TryGetObjectStateEntry (Object, out ObjectStateEntry) методы -правильный вернет истину.Если вы этого не сделаете, то не существует простого общедоступного API, который можно было бы получить из экземпляра объекта в экземпляр ObjectContext.Если объект имеет отношения и реализует IEntityWithRelationships , вы можете получить его RelationshipManager , попросить его получить любой связанный конец (он же "свойство навигации") с помощью GetAllRelatedEnds ,попросите связанный конец создать запрос с помощью CreateSourceQuery , привести его к ObjectQuery и, наконец, получить .Context .Вам не нужно делать все это, если вы хотите использовать отражение для доступа к внутренним членам классов Entity Framework, но все же лучшее, что вы можете получить от экземпляра сущности без отношений, это ObjectStateManager, а не ObjectContext.Еще лучше, если вам требуется доступ к ObjectContext из экземпляра сущности, вы можете использовать пользовательский базовый класс сущности (с настраиваемым шаблоном генерации кода или другим способом) со свойством ObjectContext, которое вы можете заполнять и очищать в обработчике событий.для ObjectStateManagerChanged .

2 голосов
/ 24 октября 2011

Это не обязательно отвечает на ваш вопрос, но для разработчика важно понять контексты, для которых они создаются, и один из методов - реализовать «UnitOfWork».Для каждой единицы работы существует отдельный контекст, и для этой единицы работы можно выполнить конкретную задачу (например, сохранить данные формы).Используя шаблон «UnitOfWork», он затем получает идентификаторы для зависимых объектов (или сам объект для идентификатора), извлекает объекты, создает новые объекты, связывает зависимые и новые объекты, а затем сохраняет изменения.Затем для блока кода, вызывающего единицу работы, уведомить другие области кода, для которых были внесены изменения, посредством обмена сообщениями.Но так как вы не имеете состояния, соглашение об обмене сообщениями не будет применяться напрямую.

Во-вторых, я почти не использую AutoMapper или что-то подобное и вместо этого использую POCO с Code First.Используя это соглашение, я теперь использую мои объекты POCO как бизнес-объекты, которые заполняются слоем данных (EF), где мои конфигурации теперь происходят в методе DbContext (UnitOfWork) OnModelCreating.Удаление всего процесса отображения уменьшает значительное количество кода и сложность.Поэтому я рекомендую взглянуть на ваш дизайн и убедиться, что есть четкие шаблоны, для которых вы управляете / разделяете доступ к данным.

При всем вышеперечисленном мапперы отлично подходят для веб-сервисов.Цель состоит в том, чтобы минимизировать объем данных, отправляемых и получаемых посредством обработки запросов и ответов.Например, если все, что хочет вызывающий абонент, это имя и фамилия, поэтому не имеет смысла отправлять весь профиль.

...