Вставка дубликатов с помощью nhibernate - PullRequest
1 голос
/ 18 января 2011

Мне нужно продублировать объект и все его дочерние элементы. Теперь я извлекаю объект, создаю глубокий клон и устанавливаю все идентификаторы в 0 (родительский и дочерний) и сохраняю его обратно в БД, но исходный объект изменяется в БД. Есть ли способ сделать это проще?

Заранее спасибо за помощь. Ariel.

EDIT

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

ОРИГИНАЛ:

Parent
  IdParent = 1
  Name = "Parent"
Child 1
  IdChild = 1
  IdParent = 1
  Name = "Child 1"

ОБНОВЛЕНО:

Parent = 0
  Name = "Parent"
Child 1
  IdChild = 0
  IdParent = null
  Name = "Child 1 modified"

Родитель имеет коллекцию типа IList. Когда я сохраняю значения, все в порядке, но когда вызывается сброс, выполняется этот дополнительный оператор:

ОБНОВЛЕНИЕ ДЕТАЛЯ SET IdParent = ноль, ГДЕ IdParent = 1

И исходные данные в БД изменяются следующим образом

СТОЛ ДЛЯ РЕБЕНКА:

IdChild     | IdParent    | Name
--------------------------------------
1           | Null        | "Child 1"
2           | 2           | "Child 1 modified"

Есть идеи ???

Большое спасибо за любую помощь. Ariel

РЕДАКТИРОВАТЬ 2

Методы, которые я использую

сериализации:

Stream archivo = File.Create(rutaArchivo);
BinaryFormatter serializador = new BinaryFormatter();
serializador.Serialize(archivo, objetoASerializar);
archivo.Close();

десериализация:

Stream archivo = File.OpenRead(rutaArchivo);
BinaryFormatter serializador = new BinaryFormatter();
T objetoDeserializado = (T)serializador.Deserialize(archivo);
archivo.Close();

1 Ответ

0 голосов
/ 18 января 2011

Хм, я думаю, что если оригинальный объект будет изменен, ваша "глубокая копия" не настолько глубока, я думаю, вы копируете коллекции из исходного объекта. Есть 2 основных способа, я думаю, вы можете сделать это:

  • Создать копию объекта .NET. Это можно сделать разными способами, изменить код клона, чтобы сделать его действительно глубоким копированием, сериализовать ваш объект и десериализовать его, чтобы сделать клон, попробуйте использовать AutoMapper для создания клона (не уверен, если он может отобразить объект на себя, создавая, таким образом, копию), но если это возможно, он скопирует ваши коллекции надлежащим образом.
  • Сделайте это в стиле БД SQL: INSERT INTO Table (SELECT * FROM TABLE, где Id = @ id)
...