NHibernate:使用数据库中仅由FK相关的未提交数据填充列表

NHibernate:使用数据库中仅由FK相关的未提交数据填充列表,nhibernate,foreign-keys,read-uncommitted,Nhibernate,Foreign Keys,Read Uncommitted,这是一个详细阐述和澄清 假设我有两个表,Foo和Bar Bar有一个FK toFoo 在应用程序中,表由类表示,并且Foo具有Bars的列表。 Bar有一个属性用于Foo的id,它在数据库中有一个FK to 在具有IsolationLevel.ReadUncommitted的会话和事务的上下文中,我将Foo的实例添加到数据库中,将生成的id分配给Bar实例的Foo_id属性,并将其添加到数据库中 现在,在调用Transaction.Commit()之前,是否可以让NHibernate从数据库中读

这是一个详细阐述和澄清

假设我有两个表,
Foo
Bar

Bar
有一个FK to
Foo

在应用程序中,表由类表示,并且
Foo
具有
Bar
s的列表。
Bar
有一个属性用于
Foo
的id,它在数据库中有一个FK to

在具有
IsolationLevel.ReadUncommitted
会话
事务
的上下文中,我将
Foo
的实例添加到数据库中,将生成的id分配给
Bar
实例的
Foo_id
属性,并将其添加到数据库中

现在,在调用
Transaction.Commit()
之前,是否可以让NHibernate从数据库中读取
Foo
Bar
列表?也就是说,读取未提交的数据?

我有。它包括一个SSDT项目,用于构建所需的数据库,并有测试显示我的问题


谢谢。

在同一事务的上下文中,您可以读回您对数据库所做的所有更改,因此是的。事务的隔离级别对于在该事务中所做的更改并不重要


但是,NHibernate通常不会更新已加载的对象。但是如果Flush()后跟Clear()或execute(),然后再次读取Foo,则其集合将包含Bar实例。(只要您在同一个会话中,提交事务与此无关,除非使用默认设置,Commit()自动调用Flush())

我已使用Flush()、Clear()和execute()进行了测试。当我在Clear()或execute(Foo)之后再次读取Foo时,其集合中确实包含Bar实例。Flush()本身没有效果。为什么Clear()会产生期望的结果?文档说它会逐出所有实例并取消任何挂起的更改。@hlitrup要做到这一点,意味着NHibernate必须找到将更改写入数据库的原因。Flush()只是手动方法,它也可能在其他时间发生。但是为什么调用Clear()可以让NHibernate读取对已加载实例的更改?如果Clear()确实逐出所有实例并取消任何挂起的更改,则会话应完全为空,否?@hlintrup Clear()无法读取对已加载实例的更改。如果在会话上调用Clear()后请求实体,NHibernate将从数据库中读取所需数据并实例化一个新对象。它将显示数据库的当前状态。因此,要使更改可见,必须在调用Clear()之前触发Flush()。另一方面:如果检索一个对象,更改一个简单属性,然后立即调用Clear(),然后检索同一个实体,那么新的对象实例将不会反映该更改。