Я пробовал 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.
Я думаю, что вы найдете ответ здесь: http://stackoverflow.com/a/21509160/861716 –
они используют AsNoTracking в этом ответе – user441365
Да, но это объясняется, при каких условиях вы можете безопасно его использовать + видеть окончательный линий. –