Fluent NHibernate - 如果其依赖项之一不存在,则不要 return 实体

Fluent NHibernate - do not return entity if one of its dependencies do not exists

假设我有 table "Cells"、table "Divisions" 并在它们之间加入 table。 此外,我无法映射 table "Cells",因为我必须映射 "CellsView"(它可以显示依赖于当前用户权限的单元格)

接下来.. 可能会出现这样一种情况,分区被分配给一个单元格,但如果当前用户想要列出它们,他将看不到该单元格。 在检索 Division 列表时,我们的用户收到异常消息,提示 ID 为“1”的 Cell 不存在。 (ID 正确且单元格存在,但我们的视图不允许显示该单元格)

如何防止 Divisions 列表抛出异常(启用延迟加载)**并防止显示会抛出异常的 division **?

我已尝试在 OnPreLoad 事件和 OnPostLoad 事件中使当前实体无效 如果无法解析我的 Cell 实体但它不起作用。返回所有部门实体,并在流畅地阅读它们时尝试解析 Cell 并抛出异常。

CellsView 连接在应用程序中的许多地方使用,因此像这种带有 PostLoad 事件的通用解决方案非常适合全局处理它。

我没有使用 Fluent,但如果它重复 what .hbm.xml mappings can do,您应该能够在 collection 上定义和应用过滤器。这应该能让你处理你的案子。

过滤器允许对实体的元素定义一些参数化限制collection。您可以在 session 打开后参数化和激活过滤器,在这里您应该知道谁是您的用户。

事实上,过滤器可以在映射之外定义,所以即使 Fluent 不处理它们,您仍然可以使用它们。

示例来自 Nhibernate reference documentation

ICollection<Cat> blackKittens = session.CreateFilter(
    pk.Kittens, "where this.Color = ?", Color.Black, NHibernateUtil.Enum(typeof(Color))
).List<Cat>();

评论后更多细节:

过滤器也应该能够导航 sub-entities。但是由于您的情况有点糟糕(定义了外键但找不到外部实体),您应该测试 sub-entity 的 non-nullable 属性,而不是它的主键。 (否则 NHibenate 很可能会通过对 parent 外键进行测试来简化它。)

"where this.Cell.SomeNonNullableProperty is not null"

这将被翻译成 SQL 并且应该毫无例外地执行,并且会过滤掉您的 non-accessible 部门。

顺便说一下,如果您为获得 Division 列表所做的一切都是明确查询它们,那么过滤器可能不是您的答案。 (不是通过一些将它们引用为 collection 的实体来获取它们。)在这种情况下,只需直接在您的查询中使用上述条件即可。

为了仅解决异常,您还可以使用 many-to-one 关系的 not-found="ignore|exception" 选项修改您的映射。但我不确定它与 lazy-loading 是否兼容,我从未尝试过。 (我不知道这个选项是否适用于流利的。)