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

时间:2010-07-26 20:30:13

标签: nhibernate

我们正在尝试将NHibernate 1.1用作Web服务API背后的持久层。那里什么新鲜事。我们使用Automapper将我们从(Fluent-)NHibernate获得的域对象转换为我们通过线路发送的DTO。

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

  1. 我们从存储库中读取了一个对象
  2. 我们将该对象(通过Automapper)翻译成DTO表单。
  3. 在一些,也许是微不足道的小提琴之后,对象被从DTO映射回Fluent-Nhibernate对象(包括不能改变的主键)。
  4. 我们保存对象。
  5. 在第4步之后,我们从NHibernate获得Nonuniqueobjectexception,并创建一个 new 行来保存对象(使用新的主键)。我们想要更新原始行,而是修改新行(!)

    所以,在这种情况下,我们如何说服NHibernate进行实际更新而不是插入操作?

    顺便说一句,如果我们跳过翻译到DTO并返回,则更新没有问题。

    == Tevya ==

3 个答案:

答案 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方法进行的操作。