c# - Fluent NHibernate - 如果其依赖项之一不存在,则不返回实体

标签 c# events nhibernate fluent-nhibernate

假设我有表“Cells”、表“Divisions”和它们之间的连接表。 此外,我无法映射表“Cells”,因为我必须映射“CellsView”(它可以显示依赖于当前用户权限的单元格)

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

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

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

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

最佳答案

我没有使用 Fluent,但如果它重复 what .hbm.xml mappings can do ,您应该能够在您的收藏中定义和应用过滤器。这应该可以让您处理您的案件。

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

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

示例来自 Nhibernate reference documentation :

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

评论后的更多细节:

过滤器也应该能够导航子实体。但是由于你的情况有点邪恶(定义了外键但找不到外部实体),你应该测试你的子实体的不可为空的属性,而不是它的主键。 (否则 NHibenate 很可能会通过对父外键进行测试来简化它。)

"where this.Cell.SomeNonNullableProperty is not null"

这将被翻译成 SQL 并且应该无异常(exception)地执行,并且会过滤掉您不可访问的部分。

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

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

关于c# - Fluent NHibernate - 如果其依赖项之一不存在,则不返回实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41807380/

相关文章:

c# - NHibernate.Glimpse 覆盖 log4net

c# - 从 web api Controller 方法返回单个对象和字符串

c# - 在 Windows 通用应用程序和 Azure 移动服务之间共享类

iphone - 如何确定 UILabel 是否被触摸?

javascript - jquery-ui datepicker 没有出现在动态输入中

NHibernate HQL 日期函数

NHibernate QueryOver Multiple Order By with Aliases

c# - 如何以编程方式检查 WP8 设备是否有前置摄像头

c# - 如何知道 System.Window.Forms.Help.ShowHelp 的结果

c - 如何在 C GTK 中检测多个按键?