2015-06-17 2 views
1

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

Кто-нибудь знает, как это сделать?

BTW Я получил эту работу с помощью AsNoTracking(), а затем с помощью Include («Ребенок ...»), но у меня есть 5 уровней отношений в моей базе данных и около 100 таблиц, которые необходимо включить, чтобы я был после автоматический способ сделать это

+0

Я думаю, что вы найдете ответ здесь: http://stackoverflow.com/a/21509160/861716 –

+0

они используют AsNoTracking в этом ответе – user441365

+0

Да, но это объясняется, при каких условиях вы можете безопасно его использовать + видеть окончательный линий. –

ответ

0

Я пробовал 3 разных способа, с сериализацией (не используется в большинстве случаев из-за ленивой загрузки), реализуя ICloneable на базовом объекте с отражением и используя пользовательские атрибуты для управления поведением Clone (я думаю, что вы ищете это) и реализации ICloneable для каждого объекта Entity.

Фактически я реализую ICloneable на каждом отдельном объекте. Обычно я делаю это:
1. MemberwiseClone()
2. Вызов ICloneable.Clone соответствующих субъектов для заполнения свойств (только на некоторых свойствах
3. на некоторых других связанных с ними лиц, которые я делаю неглубокую копию (в зависимости от потребностей)

Я знаю, что это плохо, но по моему опыту, если я использую другие методы, когда проект начинает Clone работает нормально, но через 6 месяцев, призывающих Clone на некоторых лицах клонов половины базы данных.

в вас случае с ленивым Нагрузка активирована, вы можете использовать отражение.
1. Игнорировать простое свойство
2. Вызова Clone для каждого комплексного свойства
3. сделать Еогеасп на каждое свойстве ICollection вызова Clone и добавление результата в соответствующий список

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

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

context.Entry(myEntry).Reference("myRefProp").Load(); 
context.Entry(myEntry).Collection("myColl").Load(); 

, но они не решают проблему.

EDIT
Я до сих пор есть код, чтобы применить этот метод (с атрибутами), я не использую его издревле, но если вам нужно, я могу разместить его где-нибудь. На самом деле я всегда реализую ICloneable для каждого объекта, потому что использование атрибутов для прекращения сериализации или остановки в реализации Clone лучше останавливать его в реализации Clone.

+0

Это ответ или расширенный вопрос? Если последнее: тогда вы должны добавить это в свой вопрос. Проблема в том, что не совсем понятно, что вам нужно. С одной стороны, вам, похоже, нужно клонировать 100 таблиц, с другой стороны, вы не хотите «клонировать всю базу данных каждый раз». Какой прецедент? –

+0

Вероятно, ответ между линиями. Когда вы глубоко клонируете дерево объектов, вам нужно выбрать, как останавливаться независимо от технологии.Затем вы можете выбрать способ его применения (на самом деле я реализую ICloneable Clone для каждого объекта после использования разных подходов), но это второй шаг. – bubi

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