2010-05-10 43 views
0

什么是正确的方式来更新与NHibernate的子对象,但不必“唤醒”父对象。假设你想尽量避免这种情况,因为父对象很大或者开销很大。NHibernate/ORM - 儿童更新通过Web服务

让我们假设类称为Author(父)和Book(子)。 (仍然试图避免实例化作者)

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

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

此外,如果您实例化作者并且它有Books属性。您正在尝试更新的书已经是这些书中的一本(列表<书>)。我们还遇到了 “具有相同标识符值的不同对象已与会话相关”问题。通过Web服务更新孩子的标准过程是什么?

回答

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<Author>而不去数据库中创建的ID与代理参考Author

+0

我知道还有一层NHibernate引用,我还没有得到。想你让我回到正轨。谢谢(+1和答案) – BuddyJoe 2010-05-10 20:18:23