我们正在尝试将NHibernate 1.1用作Web服务API背后的持久层。那里什么新鲜事。我们使用Automapper将我们从(Fluent-)NHibernate获得的域对象转换为我们通过线路发送的DTO。
我们看到的问题是以下情况:
在第4步之后,我们从NHibernate获得Nonuniqueobjectexception,并创建一个 new 行来保存对象(使用新的主键)。我们想要更新原始行,而是修改新行(!)
所以,在这种情况下,我们如何说服NHibernate进行实际更新而不是插入操作?
顺便说一句,如果我们跳过翻译到DTO并返回,则更新没有问题。
== Tevya ==
答案 0 :(得分:0)
1)NHibernate 1.1或Fluent NHib 1.1?
2)我认为你有一个会话管理问题。如果在session1中加载一个对象并尝试保留它而不将实际对象附加到session2,则最终会在数据库中添加一个新行。尝试在一个会话中读取和更新对象并查看结果。
答案 1 :(得分:0)
您可以尝试将对象合并到会话中。
// 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();
}
答案 2 :(得分:0)
在从DTO映射到当前ISession之后,应该附加(新)对象。附加是由ISession.Update方法进行的操作。