0

我想知道下一个问题是否可以在 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属性表示集合属性B中关联的持久对象之一。CollectionAssociationOfB

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

所以,在域中,当一个新B的被添加到 时CollectionAssociationOfB,它也被分配到LastAssociationWithB.

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

于 2013-09-23T14:53:40.083 回答