sql-server - 每个业务事务和身份 key 的 NHibernate 对话

标签 sql-server nhibernate

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

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

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

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

编辑#1:

Fabio 的一些其他评论是 here .

编辑#2:

进一步探索使我发现了 persist(...) 方法,该方法与 save(...) 类似,但不同之处足以令人困惑。此声明取自 hibernate FAQs很有趣:

The persist() method also guarantees that it will not execute an INSERT statement if it is called outside of transaction boundaries. This is useful in long-running conversations with an extended Session/persistence context.

如果它保证事务边界内的相同,它肯定会更有用吗?我的印象是,不使用交易无论如何都会让人皱眉。

最佳答案

一个解决方法 - 您可以推迟您的 ISession.Save 直到您准备好提交您的工作单元(也许作为工作单元类中的 transient 实例的集合)。

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

关于sql-server - 每个业务事务和身份 key 的 NHibernate 对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1377239/

相关文章:

c# - 使用流利的 nhibernate,是否有映射私有(private)属性

c# - 未找到方法 : 'System.Threading.Monitor.Enter' with Nhibernate, Mono 和 SQLite

c# - Nhibernate 无法反序列化可序列化的属性

mysql - 什么是 SQL Server UPDATE() 触发器函数的 MySQL 等价物?

sql-server - TSQL 'lag' 分析函数 - 性能意外不佳

sql-server - SQL Server DDL 代码的版本控制

NHibernate 二级缓存多查询

c# - Microsoft Visual Studio SQL 服务器连接 - 无效指针

sql - EF Core 检查约束

nhibernate - 使用 ViewModels 而不是实体时的 DRY 策略