【问题标题】:NHibernate / ORM - Child Update over Web ServiceNHibernate / ORM - 通过 Web 服务进行子更新
【发布时间】:2010-05-11 03:02:05
【问题描述】:

使用 NHibernate 更新子对象但不必“唤醒”父对象的正确方法是什么。假设您想尽量避免这种情况,因为父对象很大或启动起来很昂贵。

让我们假设类称为 Author(parent) 和 Book(child)。 (不过,尽量避免实例化作者)

Book 通过 Web 服务以 XML 形式返回。它被反序列化回 CLR 对象。 Book 有一个 AuthorId 属性,它允许这种情况发生。但它也有 Author 属性。

问题是,当您尝试 SaveOrUpdate() Book 并且数据库中的 author_id 被清除时,因为当对象被反序列化时 Author 为 null。这似乎是一个常见的问题。解决方法是什么?

另外, 如果您实例化 Author 并且它具有 Books 属性。您尝试更新的书已经是这些书之一(List)。我们也遇到过 “具有相同标识符值的不同对象已与会话相关联”问题。通过 Web 服务更新孩子的标准流程是什么?

【问题讨论】:

    标签: c# .net web-services nhibernate orm


    【解决方案1】:

    首先,您的持久性Book 实体应该具有Author 引用,而不是AuthorId。您应该为包含AuthorId 而不是Author 的服务使用DTO

    之后代码就简单了:

    using (var tx = session.BeginTransaction())
    {
      var book = session.Get<Book>(bookDTO.Id);
      MapAllSimplePropertiesFromDTO(bookDTO, book);
      book.Author = session.Load<Author>(bookDTO.AuthorId);
      tx.Commit();
    }
    

    session.Load&lt;Author&gt; 通过 id 创建对 Author 的代理引用,而无需访问数据库。

    【讨论】:

    • 我知道NHibernate 引用还有另一层我还没有得到。认为你让我重回正轨。谢谢(+1 和回答)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多