【问题标题】:NHibernate Conversation per Business Transaction and Identity Keys每个业务事务和身份密钥的 NHibernate 对话
【发布时间】:2009-09-04 04:34:24
【问题描述】:

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

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

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

  • 此模式是否与身份密钥不兼容?
  • 是否有任何合理的解决方法?
  • 在这种情况下我可以使用更好的模式吗?

编辑#1:

Fabio 的一些其他 cmets 是 here

编辑#2:

进一步探索使我找到了 persist(...) 方法,它与 save(...) 相似,但差异足以让人困惑。取自hibernate FAQs 的这句话很有意思:

persist() 方法还保证 它不会执行 INSERT 如果在外部调用它,则声明 交易边界。这很有用 在与 扩展会话/持久性上下文。

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

【问题讨论】:

  • 我刚刚尝试了 Session.Persist() 并且它立即执行了插入,尽管我没有打开的事务 - 如果这是它的意思,它不起作用(至少在 2.1 上) .

标签: sql-server nhibernate


【解决方案1】:

一种解决方法 - 您可以推迟 ISession.Saves,直到您准备好提交您的工作单元,也许是您的工作单元类中的临时实例的集合。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    相关资源
    最近更新 更多