自动映射到DTO后保存NHibernate对象

自动映射到DTO后保存NHibernate对象,nhibernate,Nhibernate,我们试图使用NHibernate1.1作为web服务API后面的持久层。没有什么新鲜事。我们使用Automapper将从Fluent NHibernate获得的域对象转换为我们通过网络发送的DTO 我们看到的问题是以下情况: 我们从存储库中读取一个对象 我们通过Automapper将该对象转换为DTO形式。 经过一些可能是琐碎的修改后,对象从DTO映射回Fluent Nhibernate对象,包括无法更改的主键。 我们保存对象。 在第4步之后,我们从NHibernate获得一个ununiqueO

我们试图使用NHibernate1.1作为web服务API后面的持久层。没有什么新鲜事。我们使用Automapper将从Fluent NHibernate获得的域对象转换为我们通过网络发送的DTO

我们看到的问题是以下情况:

我们从存储库中读取一个对象 我们通过Automapper将该对象转换为DTO形式。 经过一些可能是琐碎的修改后,对象从DTO映射回Fluent Nhibernate对象,包括无法更改的主键。 我们保存对象。 在第4步之后,我们从NHibernate获得一个ununiqueObjectException,它创建一个新行,用一个新的主键保存对象。我们想更新原始行,但是新行被修改了

那么,在这种情况下,我们如何说服NHibernate执行实际的更新而不是插入操作呢

顺便说一句,如果我们跳过对DTO的翻译并返回,那么更新就没有问题


==Tevya==

1 NHibernate 1.1还是流利的NHib 1.1?
2我认为您有会话管理问题。如果您在session1中加载一个对象并尝试将其持久化,而不将实际对象附加到session2,那么您将在DB中得到一个新行。尝试在一个会话中读取和更新对象,并查看结果。

您可以尝试将对象合并到会话中

// Assuming you already have a session open
// and you've already mapped your DTO back
using (var tx = session.BeginTransaction())
{
    var nhibernateObject = (YourNhibernateObjectType)session.Merge(mappedBackFromDTO);

    tx.Commit();
}

从DTO映射到当前ISession后,应附加新对象。附加是ISession.Update方法执行的操作。

NHibernate中的会话管理我们使用的是Fluent NHibernate 1.1,它要求每个线程建立单独的会话。从本质上讲,线程不知道彼此的存在。在这种情况下,是否需要保留一个覆盖所有会话中所有对象的全局列表?这看起来效率极低,维护起来也很麻烦。对您所主张的另一种回应是,我们需要通过一个线程序列化所有NHibernate活动,这样我们就可以保持在一个线程中读取和更新所有对象。我理解你的意思对吗?我只是想找出核心问题。如果在一次会话中读取和更新对象时,仍然存在问题,那么我的建议是错误的。只需创建一个自定义场景并找出实际问题所在。您正在使用winforms还是web应用程序?