【发布时间】:2010-10-29 22:23:23
【问题描述】:
我正在使用 Nhibernate(我是一个完全的菜鸟),我想要做的是复制一个从数据库加载的实体并用新的 ID 保存它...有没有人遇到过这种情况?任何帮助将不胜感激。
【问题讨论】:
标签: c# .net nhibernate fluent-nhibernate
我正在使用 Nhibernate(我是一个完全的菜鸟),我想要做的是复制一个从数据库加载的实体并用新的 ID 保存它...有没有人遇到过这种情况?任何帮助将不胜感激。
【问题讨论】:
标签: c# .net nhibernate fluent-nhibernate
只需执行new MyClass() 并复制除 ID 之外的所有内容。您可以为此使用反射。
【讨论】:
我需要对一组非常复杂的对象执行此操作,到目前为止我发现的是:
NHibernate 并不完全支持这一点。
如果您尝试简单地替换从会话中获得的对象的 Id,您将收到 Nhibernate 错误:实例的标识符已从 更改为
如果会话不再知道它检索到的对象,即如果您在保存和刷新之前驱逐它们,那么现在只需更改 id 即可。所以你可以写这样的代码:
public void CloneStudent(Guid studentId)
{
// Get existing student
Student student = _session.Get<Student>(studentId);
// Copy by reference
Student newStudent = student;
// Reset Id to do quick and dirty clone
newStudent.Id = Guid.NewGuid();
newStudent.Sticker = "D";
// Must evict existing object or Nhibernate will throw object modified error
_session.Evict(student);
// Save new object
_session.Save(newStudent);
_session.Flush();
}
这样做的问题是,如果您的对象图有任何深度,您必须确保驱逐整个集合,然后您可能需要会话中的原件,但您仍必须再次检索它们。这是一个令人头疼的后勤问题,并且会产生意图非常模糊和令人费解的代码。
我不推荐。
更常见的做法是序列化为二进制流并将该流重构为一组新的对象。很好,但只有当你的对象都是可序列化的时候才有效。
对我来说不是这样,我正在做的是编写手动代码来使用复制构造函数对对象图进行深度复制。这很复杂,也可能导致维护问题,但如果无法序列化对象,则几乎没有更好的选择。
抱歉,如果不能选择序列化,深度复制对象仍然是一项复杂的任务。
【讨论】: