用nhibernate插入重复项

时间:2011-01-18 15:30:39

标签: c# visual-studio-2008 nhibernate

我需要复制一个对象及其所有子对象,我现在正在做的是检索对象,进行深度克隆并将所有id放到0(父级和子级)并将其保存回DB,但是在DB中修改原始对象。有没有办法让它变得更简单?

提前感谢您的帮助。 爱丽儿。

修改

我正在使用序列化来获取对象的深层副本,但最奇怪的是这个。我正在序列化对象并将其保存在文件中,然后我反序列化对象并将id放到0,然后我为父和子的某些值进行一些操作来更改原始值,我保存一切正常,但是问题是当我刷新会话时。例如我有这个:

ORIGINAL:

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类型的集合当我保存值时,Everythings很好,但是当调用flush时,这个额外的语句被执行:

UPDATE Child SET IdParent = null WHERE IdParent = 1

数据库中的原始数据就像这样修改

儿童表:

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

任何想法???

非常感谢您的帮助。 爱丽儿

编辑2

我正在使用的方法

SERIALIZE:

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 :(得分:0)

嗯,我认为如果原始对象被修改,你“深层复制”不是那么深,我想你是从原始对象复制集合。有两种一般的方式,我认为你可以做到这一点:

  • 创建.NET对象副本这可以通过不同的方式完成,修改克隆代码以使其真正深度复制克隆,序列化您的对象并反序列化它以进行克隆,尝试使用AutoMapper创建克隆(不确定是否它可以将对象映射到自身,从而创建副本)但是如果可以,它将以正确的方式复制集合。
  • 执行DB SQL样式:INSERT INTO表(SELECT * FROM TABLE其中Id = @id)