我想知道下一个问题是否可以在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 join ,因此您不需要在其中具有明确的1:n关系A
表,但它会维护类属性吗?
或者我当前的方法是解决此方案的推荐方法吗?
旁注:在实际场景中,CollectionAssociationOfB
是一个有序列表,因为在NHibernate映射配置中指定了排序。
答案 0 :(得分:1)
您可以使用公式指定关系:
这是否更好是有争议的......这取决于你的情况 - 一方面它确保一致性,但另一方面它可能会在查询时有性能损失 - 所以它真的取决于你自己的具体情况下。
另一个替代方法是在插入B时使用触发器来更新A中的列。这具有将逻辑移入数据库的缺点,但它将确保一致性而不会造成潜在的性能损失。
你也可以通过使用NHibernate事件拦截保存B然后更新A来实现相当于触发器,同时利用代码中剩余的逻辑,但是对数据库的任何直接更新都可能引入不一致的缺点
当然,两种触发选项都会在某种程度上模糊逻辑,而不是在A或B上有一个执行逻辑的方法。我个人可能会在A中添加一个方法来添加新的B并更新关联,但是你需要确保没有人直接更新B集合并绕过你的方法。