我想按照here所述在WPF应用程序中实现每个业务事务模式的对话。不幸的是,这个应用程序有一个庞大的现有数据库,在所有表中使用SQL Server生成的身份密钥。
我知道在NHibernate会话中添加一个新对象会导致它被插入(如果它有一个身份密钥)。 Fabio在每个请求结束时都有提交当前事务的模式,即使我们还没有完成整个工作单元。
如果我理解正确,这意味着我的对象将被插入到数据库中,即使我放弃了工作单元也不会被删除。所以:
编辑#1:
Fabio的其他一些评论是here。
编辑#2:
进一步探索引导我使用 persist(...)方法,该方法类似于 save(...),但只是不同以至于令人困惑。来自hibernate FAQs的陈述很有意思:
persist()方法也保证 它不会执行INSERT 如果在外面调用它的语句 交易边界。这很有用 与长期对话 扩展的会话/持久化上下文。
当然,如果它在事务边界内保证相同,那么它会更有用吗?我的印象是,不使用交易无论如何都不满意。
答案 0 :(得分:1)
一种解决方法 - 您可以暂停ISession.Save
直到您准备好提交工作单元,或许作为工作单元中的瞬态实例集合。
此外,如果您的实体被现有实体引用(并且它有意义),您可以级联插入 - 一致地完成,这意味着您只需要显式插入聚合根对象。这是我在这种情况下通常使用的方法。