每个业务事务和身份密钥的NHibernate对话

时间:2009-09-04 04:34:24

标签: sql-server nhibernate

我想按照here所述在WPF应用程序中实现每个业务事务模式的对话。不幸的是,这个应用程序有一个庞大的现有数据库,在所有表中使用SQL Server生成的身份密钥。

我知道在NHibernate会话中添加一个新对象会导致它被插入(如果它有一个身份密钥)。 Fabio在每个请求结束时都有提交当前事务的模式,即使我们还没有完成整个工作单元。

如果我理解正确,这意味着我的对象将被插入到数据库中,即使我放弃了工作单元也不会被删除。所以:

  • 此模式是否与身份密钥不兼容?
  • 有合理的工作吗?
  • 在这种情况下,我可以使用更好的模式吗?

编辑#1:

Fabio的其他一些评论是here

编辑#2:

进一步探索引导我使用 persist(...)方法,该方法类似于 save(...),但只是不同以至于令人困惑。来自hibernate FAQs的陈述很有意思:

  

persist()方法也保证   它不会执行INSERT   如果在外面调用它的语句   交易边界。这很有用   与长期对话   扩展的会话/持久化上下文。

当然,如果它在事务边界内保证相同,那么它会更有用吗?我的印象是,不使用交易无论如何都不满意。

1 个答案:

答案 0 :(得分:1)

一种解决方法 - 您可以暂停ISession.Save直到您准备好提交工作单元,或许作为工作单元中的瞬态实例集合。

此外,如果您的实体被现有实体引用(并且它有意义),您可以级联插入 - 一致地完成,这意味着您只需要显式插入聚合根对象。这是我在这种情况下通常使用的方法。