【发布时间】:2011-12-29 12:56:18
【问题描述】:
我有一个两层(非 Web)系统,我会将一些对象加载到系统内存中,并偶尔将它们刷新回数据库。假设我只需要更新一个对象,但该对象是一个相当大的图,可能包含数百个实体,我使用级联将保存传播到整个图。
当在第二个会话中调用 Session.Update(the_big_object) 时,NHibernate “正确”地将整个对象图中的每个实体覆盖到数据库中,从而创建大量更新,即使它们没有更改。这是可以理解的,因为它不知道在会话之外发生了什么变化。使用 Session.Merge(the_big_object) 并没有多大帮助,因为它还需要大量查询。
问题出在我的例子中,通常大图中只有少数实体实际发生了变化。我在想的是,与其使用级联来保存整个对象,不如将脏实体集合保留在内存中,并且只在需要时才刷新它们。为了做到这一点,我可能需要为那些绑定到它们的设置器的类添加一个脏标志,等等。
然后我想,这不正是 NHibernate 在会话中一直在做的事情,以确定哪些对象是脏的吗?所有这些代理/版本的东西都适用于持久对象,但不适用于分离的对象(或者它们是吗?)。我只是觉得需要手动再次执行此操作有点愚蠢。
有什么我可以采取的建议/方法,或者我缺少什么魔术吗?
非常感谢!
【问题讨论】:
-
哦,我不能在每个实体更改时都将其刷新到数据库中,因为它可能发生得太频繁了。我只分批冲洗它们。
-
前段时间我在网络应用中搜索了很多东西。
标签: .net nhibernate cascade