NHibernate 多对一“即时”

本文关键字:即时 多对一 NHibernate | 更新日期: 2023-09-27 18:32:28

我想知道下一个问题是否可以在NHibernate中以不同的方式解决。

假设我们有这个域:

public class A 
{
     public virtual B LastAssociationWithB { get; set; }
     public virtual ICollection<B> CollectionAssociationOfB { get; set; }
}
public class B
{
     public virtual DateTime DateAdded { get; set; }
}

LastAssociationWithB 属性表示在 CollectionAssociationOfB 集合属性中关联的B持久性对象之一。

实际上,LastAssociationWithB表示按日期添加的最后B持久对象。

因此,在域中,当将新B添加到CollectionAssociationOfB时,它也会被分配给LastAssociationWithB

这是以后将代码转换为不太复杂的 LINQ 查询的好方法。

无论如何,我的问题是:你知道其他方法吗?例如,某种多对一关联在后台生成 SQL 连接,因此您不需要在 A 表中具有显式的 1:n 关系,但它会维护类属性?

还是我当前的方法是解决这种情况的推荐方法?

旁注:在实际场景中,CollectionAssociationOfB是一个有序列表,因为在 NHibernate 映射配置中指定了排序。

NHibernate 多对一“即时”

您可以使用公式指定关系:

这是否更好是有争议的......这取决于你的情况 - 一方面它确保一致性,但另一方面,它在查询时可能会有性能损失 - 所以这实际上取决于你自己的具体情况。

另一种方法是在插入 B 时使用触发器来更新 A 中的列。 这样做的缺点是将逻辑移动到数据库中,但它可以确保一致性,而不会造成潜在的性能损失。

您还可以通过使用 NHibernate 事件拦截保存 B 然后更新 A 来实现等效的触发器 - 好处是逻辑保留在代码中,但缺点是对数据库的任何直接更新都可能导致不一致。

当然,这两个触发器选项都在某种程度上混淆了逻辑,而不是在 A 或 B 上有一个执行逻辑的方法。 我个人可能会在 A 中放置一个方法来添加新的 B 并更新关联,但随后您需要确保没有人直接更新 B 集合并绕过您的方法。