如果我有一个实体Foo
,我坚持使用NHibernate并使用Linq检索它,如下所示:
var foos = FooRepository.GetFoos.Where(x => x.LikesWearningFunnyHats == true);
然后我将每个Foo
弄脏:
foo.LikesWearingFunnyHats = false;
告诉存储库保存它:
FooRepository.Save(foo);
我目前发现Foo
未被保存。这是因为我使用Linq而不是ID或通过关联来检索它们吗?
答案 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是否会发出正确的命令。获取实体的事件策略无关紧要。