Entity Framework Отсоединить сущность и связанные сущности ушли - PullRequest
4 голосов
/ 14 декабря 2011

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

Заранее спасибо!

Ответы [ 2 ]

8 голосов
/ 14 декабря 2011

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

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

3 голосов
/ 14 декабря 2011

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

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

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

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

Вот ссылка на довольно хорошую статью MSDN о загрузке сущностей .

...