NHibernate-Linq检索的实体是否可更新?

NHibernate-Linq检索的实体是否可更新?,nhibernate,repository-pattern,Nhibernate,Repository Pattern,如果我有一个实体Foo,我正在使用NHibernate持久化它,并且我使用Linq检索它,就像这样: var foos = FooRepository.GetFoos.Where(x => x.LikesWearningFunnyHats == true); 然后我把每个食物都弄脏,就像这样: 并告诉存储库保存它: FooRepository.Save(foo); 我目前发现没有保存foo。这是因为我使用Linq而不是通过ID或关联来检索它们吗?这不应该是因为您使用的是Linq。Lin

如果我有一个实体Foo,我正在使用NHibernate持久化它,并且我使用Linq检索它,就像这样:

var foos = FooRepository.GetFoos.Where(x => x.LikesWearningFunnyHats == true);
然后我把每个食物都弄脏,就像这样:

并告诉存储库保存它:

FooRepository.Save(foo);

我目前发现没有保存foo。这是因为我使用Linq而不是通过ID或关联来检索它们吗?

这不应该是因为您使用的是Linq。Linq表达式树只是被转换成与IQuery或HQL字符串相同的ANTLR原语,然后再转换成SQL

确保在完成持久性操作后刷新会话和/或提交该会话中固有的事务。您应该了解,NHibernate在您和数据库之间提供了一个隔离层,其设计目的是决定何时向数据库发送更新,以节省到数据库服务器的往返时间。通常,它是分批进行的;它将收集10到20条语句,然后将它们作为一批推送到SQL Server。如果您一次所做的工作单位小于此单位,则必须使用ForceFlush方法强制会话执行SQL更新,从而覆盖其推迟发送更新的决定


最好是通过公开会话的方法或其包含的存储库来在会话中创建、提交和回滚事务,从而使其可从外部控制。

为什么您认为没有实际保存?尝试调用session.Flush并确保提交事务,以查看NH是否会发出正确的命令。获取实体的事件策略应该无关紧要。

好的,所以不是这样,而是别的。谢谢。好的,我要打电话给Flush。我本来以为调用Dispose也会刷新它,但是没有。我感到困惑,因为添加到Foos集合的新实例正在保存,而脏掉的现有实例却没有保存。我仍然不明白为什么会这样。对象的新实例在保存时需要一个ID,以便会话可以唯一地标识它们。如果该ID是由标识列common提供的,则只有DB可以提供它,因此NH急切地插入新记录以获取该ID。但是,现有对象已经有了ID,因此它可以保持在会话中,并由代码无限期地使用/更改,而无需将更改推回到数据库,直到您告诉它工作完成并保存更改。哇!多么清晰详细的解释啊。非常感谢你!我知道它没有被保存,因为没有向数据库发送更新。我现在需要找出原因。请尝试调用session.flush:没有更新是因为NH没有按照您的要求进行更新,但它会立即进行更新。
FooRepository.Save(foo);