重新应用FilterDefinition

时间:2011-02-23 10:55:39

标签: fluent-nhibernate nhibernate-mapping conditional

我有一个应用程序,它对系统的配电进行建模,如果某些组件发生故障,则路由会自动重新路由。我通过添加一个连接实体来建模,该连接实体具有父组件的ID和子组件的ID。这个想法是,对于可能失败的项目,有正常工作条件的连接和每个失败情况的另一个连接。例如,如果有40个组件,其中9个可能失败,那么我有2 ^ 9(512)个可能的故障,并且每个组件有2 ^ 9个连接实体。每个连接都以其所代表的故障模式命名。

到目前为止,非常好,非常灵活且有效。

但是,每次加载总线图时,所有连接都会加载,导致40 * 512(20480)个连接实体,当前故障模式只需要40个时,并且毫不奇怪,这会导致应用程序生成资源并且运行缓慢。

因此,我已经定义了一个FilterDefinition来限制加载到所需命名连接的连接(如果该组件是特定类型)和正常连接(如果它是任何其他类型)并将其添加到启用的组件的连接集合映射中过滤器并设置参数。

public FailureModeFilter()
{
    WithName("FailureName")
        .WithCondition("((Name = :name and ObjectType <> 8) or 
                         (Name = 'Normal' and ObjectType = 8))")
        .AddParameter("name", NHibernateUtil.String);
}

毫不奇怪,这很有效。

但是,你知道不会有障碍吗?

但是,当选择新的故障模式并重新加载图表时,它不会应用新过滤器但会保留旧过滤器。我已经尝试设置新参数,禁用过滤器,再次启用它并将参数设置都无效。

那么,我做错了什么/没做错误(如果适用的话删除),或者没有这样做,有关如何解决这个问题的建议吗?

图表打开时正在使用相同的会话。是的,我知道这不是建议的最佳实践,但由于其他原因,它是此部分应用程序的最佳解决方案。请不要对此事进行侧面跟踪,告诉我这是如何与我已经知道的厄运,忧郁和沮丧的不良做法。问题是关于更换过滤器。

1 个答案:

答案 0 :(得分:1)

回答了我自己提出的改变问题。

这个答案是刷新组件以强制从数据库重新加载。

session.Refresh(entity);

当你想出来时这么简单!