2011-12-14 7 views
4

Когда я использую Entity Framework, я хочу запросить запись в контексте и добавить ее в другой контекст с той же схемой, после запроса записи, я отключаю ее от контекст, но связанные объекты все прочь, есть ли способ его решить?Entity Framework Отключить сущность и связанные с ней объекты

Заранее благодарен!

+0

Что вы имеете в виду * «связанные сущности все прочь» *? – Yuck

ответ

8

Это «по дизайну». EF может отделять объекты только один за другим, но в то же время EF не поддерживает графические объекты, состоящие из прикрепленных и отдельных объектов. Из-за этого, когда вы отсоединяете объект, он разбивает все отношения на остальную часть привязанного графа объектов. Отделить весь объектный граф в настоящее время не поддерживается, но вы можете проголосовать за эту функцию на Data UserVoice.

В качестве обходного пути вы можете отключить ленивую загрузку в своем контексте, использовать загружаемую загрузку, описанную @CodeWarrior, для загрузки именно данных, которые необходимо передать в другой контекст. После загрузки данных сериализуйте их в поток и сразу же десериализуйте их в новый экземпляр графа объектов. Это способ сделать глубокий клонированный граф сущности, который отсоединен, но имеет все отношения нетронутыми (требуется отладка с ленивой загрузкой, иначе сериализация будет загружать все другие свойства навигации, что может привести к тому, что ожидается гораздо больший граф объектов). Единственное требование заключается в том, что ваши объекты должны быть сериализуемыми с помощью сериализатора по вашему выбору (обратите внимание на циклические ссылки, которые обычно требуют некоторой специальной обработки или дополнительных атрибутов для ваших объектов).

+0

Спасибо за ваш ответ! – James

3

Вы спрашиваете, как загрузить дочерние объекты? Если это так, вы можете выполнить загрузку с помощью метода .Include. Учитывая класс Person и класс PhoneNumber, где лицо имеет коллекцию PhoneNumber, вы можете сделать следующее:

List<Person> People = db.People.Where(p => p.Name = "Henry") 
           .Include("PhoneNumbers") 
           .ToList(); 

Или вы можете делать то, что называется явной загрузки, где вы загружать объекты и вызывать .load метод в наборах дочерних и связанных объектов, которые вы хотите загрузить. Как правило, вы делаете это, если у вас нет LazyLoading (и LazyLoading включен по умолчанию в 4.0+, не помню в предыдущих версиях).

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

Вот ссылка на довольно хороший MSDN article on loading entities.

+0

Спасибо вашему ответу! – James

+0

Нет проблем. Пожалуйста, не забудьте проголосовать за сообщения, которые помогут вам. – CodeWarrior

Смежные вопросы