【问题标题】:How do I copy an object with NHibernate如何使用 NHibernate 复制对象
【发布时间】:2010-10-29 22:23:23
【问题描述】:

我正在使用 Nhibernate(我是一个完全的菜鸟),我想要做的是复制一个从数据库加载的实体并用新的 ID 保存它...有没有人遇到过这种情况?任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net nhibernate fluent-nhibernate


    【解决方案1】:

    只需执行new MyClass() 并复制除 ID 之外的所有内容。您可以为此使用反射。

    【讨论】:

    • +1:这就是我们所做的;您也可以使用 automapper 或 valueinjecter 来执行复制;让它忽略 id(显然)。
    • i 秒用于用户自动映射器。这对我有用,而且工作量很小。
    【解决方案2】:

    我需要对一组非常复杂的对象执行此操作,到目前为止我发现的是:

    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();
    
    
        }
    

    这样做的问题是,如果您的对象图有任何深度,您必须确保驱逐整个集合,然后您可能需要会话中的原件,但您仍必须再次检索它们。这是一个令人头疼的后勤问题,并且会产生意图非常模糊和令人费解的代码。

    我不推荐。

    更常见的做法是序列化为二进制流并将该流重构为一组新的对象。很好,但只有当你的对象都是可序列化的时候才有效。

    对我来说不是这样,我正在做的是编写手动代码来使用复制构造函数对对象图进行深度复制。这很复杂,也可能导致维护问题,但如果无法序列​​化对象,则几乎没有更好的选择。

    抱歉,如果不能选择序列化,深度复制对象仍然是一项复杂的任务。

    【讨论】:

    • 感谢 Sisyphus 的建议,我害怕你刚才的建议,但幸运的是,我可以方便地让我的所有实体对象都可序列化。我会试一试,然后告诉你结果如何。
    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 2010-10-06
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多