C# NHibernate/ORM-通过Web服务的子更新

C# NHibernate/ORM-通过Web服务的子更新,c#,.net,web-services,nhibernate,orm,C#,.net,Web Services,Nhibernate,Orm,使用NHibernate更新子对象而不必“唤醒”父对象的正确方法是什么。假设您希望尽量避免这种情况,因为父对象太大或启动成本太高 让我们假设类被称为Author(父类)和Book(子类)。(尽管如此,仍试图避免实例化Author) Book以XML的形式通过web服务返回。它被反序列化回CLR对象。 Book的AuthorId属性允许这种情况发生。但它也有作者属性 当您尝试保存或更新()Book时,会出现问题,并且数据库中的author\u id会被清除,因为对象反序列化时author为null

使用NHibernate更新子对象而不必“唤醒”父对象的正确方法是什么。假设您希望尽量避免这种情况,因为父对象太大或启动成本太高

让我们假设类被称为Author(父类)和Book(子类)。(尽管如此,仍试图避免实例化Author)

Book以XML的形式通过web服务返回。它被反序列化回CLR对象。 Book的AuthorId属性允许这种情况发生。但它也有作者属性

当您尝试保存或更新()Book时,会出现问题,并且数据库中的author\u id会被清除,因为对象反序列化时author为null。这似乎是一个常见的问题。解决办法是什么

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

首先,您的持久
书籍
实体应该只有
作者
参考,而不是
作者
。对于包含
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();
}
使用(var tx=session.BeginTransaction())
{
var book=session.Get(bookDTO.Id);
将所有SimpleProperties从DTO映射到(bookDTO,book);
book.Author=session.Load(bookDTO.authord);
tx.Commit();
}

session.Load
通过id创建对
作者的代理引用
,而无需访问数据库。

我知道还有另一层NHibernate引用我还没有得到。我想你让我重回正轨了。谢谢(+1和答案)