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

时间:2011-03-04 16:38:54

标签: nhibernate repository-pattern

如果我有一个实体Foo,我坚持使用NHibernate并使用Linq检索它,如下所示:

var foos = FooRepository.GetFoos.Where(x => x.LikesWearningFunnyHats == true);

然后我将每个Foo弄脏:

foo.LikesWearingFunnyHats = false;

告诉存储库保存它:

FooRepository.Save(foo);

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

2 个答案:

答案 0 :(得分:0)

这不应该是因为你正在使用Linq。 Linq表达式树只是转换为与IQuery或HQL字符串相同的ANTLR原语,并从那里转换为SQL。

确保在完成持久性操作后刷新Session,和/或提交该Session中固有的Transaction。您应该了解NHibernate在您和数据库之间提供了一层分离,旨在决定何时向DB发送更新,以节省到DB服务器的往返。通常,它是在“批次”中这样做的;在将它们作为一个批处理推送到SQL Server之前,它会收集十到二十个语句。如果您的工作单元数量少于一次,则必须使用ForceFlush()方法通过强制会话执行SQL更新来覆盖发送更新的决定。

最好通过公开Session或其包含Repository的方法来创建,提交和回滚Session中的事务,从而使外部可控。

答案 1 :(得分:0)

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