gpt4 book ai didi

asp.net-mvc - 使用存储过程进行更新时,为什么 NHibernate 不反射(reflect)内存中状态?

转载 作者:行者123 更新时间:2023-12-04 10:39:52 26 4
gpt4 key购买 nike

我有一个进程,我有一个 NHibernate session ,我用它来对数据库运行查询。然后我遍历结果集合,对于每次迭代,使用相同的 NHibernate session ,我调用 SQL 存储过程(使用 CreateSQLQuery()ExecuteUpdate()),最终对该实体的字段执行更新。

当它完成对列表的迭代(并调用 SP x 次)后,如果我直接在 SSMS 中检查数据库,我可以看到每行的 UPDATE 都已应用。

但是,在我的代码中,如果我立即再次运行相同的初始查询以检索该实体列表,则它不会反射(reflect) SP 为每一行所做的更新 - 该值仍然为 NULL。

我在我的应用程序中没有针对 NHibernate 的配置指定任何缓存行为,并尝试了不同的 SetCacheMode()调用查询时,但似乎没有任何区别 - 我可以直接在数据库中看到的值已更新,当我重新查询(使用 Session.QueryOver() )数据库(使用该相同的 session )。

最佳答案

调用 CreateSQLQuery (更新数据库,单行还是多行都没有关系),实际上你在做DML-style operation它不会更新内存中的状态。
任何调用 CreateSQLQueryCreateQuery不会使用/反射(reflect)跟踪。这些被认为超出了工作单元的范围。
这些操作直接影响底层数据库,忽略任何内存状态。

14.3. DML-style operations
As already discussed, automatic and transparent object/relational mapping is concerned with the management of object state. This implies that the object state is available in memory, hence manipulating (using the SQL Data Manipulation Language (DML) statements: INSERT, UPDATE, DELETE) data directly in the database will not affect in-memory state. However, NHibernate provides methods for bulk SQL-style DML statement execution which are performed through the Hibernate Query Language (HQL). A Linq implementation is available too.



他们(可能)处理批量数据。出于性能原因,它们在某些情况下是必需的。有了这些,跟踪就不起作用了;所以是的,内存状态变得无效。你必须小心使用它们。

if I then immediately run the same initial query again, to retrieve that list of entities, it does not reflect the updates that the SP made for each row - the value is still NULL.



这是由于第一( session )级缓存。这在默认情况下始终处于启用状态,不能使用 ISession 禁用。 .

当您 第一 加载对象,它是一个数据库命中。您从数据库中获取对象 - 循环遍历它们 - 执行那些超出工作单元的命令(如上所述) - 和 再次执行相同的查询 两次 在相同的 ISession 下加载相同的对象实例。第二次来电 不命中数据库根本。

它只是从内存中返回实例。由于您的内存中实例根本没有更新,因此您始终会获得原始实例。

要获取更新的实例,请关闭第一个 session 并使用新 session 重新加载实例。

更多详情请引用: How does Hibernate Query Cache work

关于asp.net-mvc - 使用存储过程进行更新时,为什么 NHibernate 不反射(reflect)内存中状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59983989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com