Объект с самостоятельным отслеживанием — загрузка навигационного свойства навигационного свойства

Мне любопытно, что лучше всего подходит для этой ситуации в Entity Framework 4.0. У меня есть следующая карта объектов:

Объект A -> Объект B -> Объект C

Где Entity A содержит список Entity B, каждый из которых содержит список Entity C. Я использую объекты самоотслеживания, и когда я загружаю объект A, я делаю что-то похожее на это:

EntityA entityA = ctx.EntityA.Include("EntityB").Where(x => x.Id == id).SingleOrDefault();

Когда я попытался сделать это:

EntityA entityA = ctx.EntityA.Include("EntityB").Include("EntityC").Where(x => x.Id == id).SingleOrDefault();

Это не удается, потому что он не может найти навигационное свойство «Сущность C». Есть ли способ загрузить свойства навигации? Мне также потребуется иметь возможность отслеживать изменения, принимать изменения и помечать как удаленные для различных операций CRUD.

В качестве побочного вопроса: существует ли общий атрибут, используемый для идентификации свойства навигации в Entity Framework? Я надеялся использовать отражение и рекурсию, чтобы идентифицировать все мои свойства навигации.


person Brandon    schedule 13.08.2010    source источник


Ответы (1)


Попробуйте это. Он загружает свойство навигации из текущей точки графа объектов:

EntityA entityA = ctx.EntityA.Include("EntityB.EntityC").Where(x => x.Id == id).SingleOrDefault();

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

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

person Wallace Breza    schedule 13.08.2010
comment
Я использовал шаблон STE T4 для создания своих сущностей, однако я все еще вынужден делать следующее: foreach (EntityB entityB в entity.EntityB) entityB.AcceptChanges(); - person Brandon; 14.08.2010
comment
Кроме того, есть ли способ автоматически включать свойства навигации при загрузке объекта? Какой-то атрибут [Include]? - person Brandon; 14.08.2010
comment
У ObjectContext есть свойство ObjectContext.ContextOptions.LazyLoadingEnabled, но, попробовав это на себе, я не думаю, что оно применимо к объектам самоотслеживания. Опять же, вы можете изменить шаблон T4, чтобы он поддерживал отложенную загрузку. - person Wallace Breza; 14.08.2010
comment
Что произойдет, если вы просто вызовете SaveChanges() в контексте вашего объекта? Все изменения, отслеживаемые в ваших объектах, должны автоматически обновляться в хранилище данных. Как вы используете эти сущности? Над службой WCF, приложением ASP.NET, богатым клиентом? Отсоединяются ли они от контекста в какой-то момент, а затем вам нужно повторно прикрепить и синхронизировать изменения? - person Wallace Breza; 14.08.2010
comment
Верно, это отдельные объекты, которые я присоединяю позже. Если я делаю только SaveChanges(), а не AcceptChanges() для каждого экземпляра объекта, то состояние объектов не изменяется с Modified/Added на NotModified. - person Brandon; 16.08.2010
comment
Существует также перегрузка метода SaveChanges(), поэтому при передаче true, SaveChanges(true) он автоматически примет все изменения при сохранении. Кроме того, в некоторых случаях у меня были проблемы: после того, как я прикрепил свои объекты обратно к ObjectContext, они не считались измененными. Я смог решить эту проблему, выполнив вызов ObjectStateManager.ChangeObjectState() вне ObjectContext после присоединения объекта. - person Wallace Breza; 16.08.2010
comment
@Брэндон, @Уоллес -- у меня похожий вопрос. Есть ли шанс, что вы могли бы взглянуть? stackoverflow.com/questions/3671193/ - person Drew Noakes; 08.09.2010