无外键的NHibernate映射集合

无外键的NHibernate映射集合,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个叫做WorkingDays的类,这个类需要一组日期,这些日期是银行假日的日期。在我们的数据库中,我们有一个包含这些日期的表-我希望nhibernate获取所有这些日期并填充bankHolidays集合 但问题是,我没有一个表来表示数据库中的链接——当所有工作日impl都有完全相同的银行假日日期列表时,这似乎真的没有必要 那么,我如何在不需要添加外键的情况下映射它呢?我希望下面的代码能够更好地说明: public class WorkingDays : Interval { publ

我有一个叫做WorkingDays的类,这个类需要一组日期,这些日期是银行假日的日期。在我们的数据库中,我们有一个包含这些日期的表-我希望nhibernate获取所有这些日期并填充bankHolidays集合

但问题是,我没有一个表来表示数据库中的链接——当所有工作日impl都有完全相同的银行假日日期列表时,这似乎真的没有必要

那么,我如何在不需要添加外键的情况下映射它呢?我希望下面的代码能够更好地说明:

public class WorkingDays : Interval
{
   public ICollection<DateTime> BankHolidays
   {
       get;
       private set;
   }
}
公共类工作日:间隔
{
公众假期
{
得到;
私人设置;
}
}

您需要将其作为实体本身的集合,这有什么原因吗?为什么不让一个单独的存储库/DAO负责访问此集合?如果数据是相当静态的,那么您也可以使用二级缓存来获得相当多的数据。

如果您只需要一个只读集合,您可以尝试以下方法:

<property name="BankHolidays" type="DateTime[]" formula="(SELECT Date FROM BankHolidays)" update="false" insert="false" />

我有一个想法,我想我将来会插话帮助别人

我认为您不能强制NHibernate映射与数据库中的父对象没有某种关系的子对象。毕竟,它是一个对象映射器


解决方案是通过数据库暗示一种关系。创建一个链接工作日和银行假日的视图。然后将HasMany(x=>x.BankHolidays)添加到您的工作日映射中。

除非我加载日期时间并将其传递到工作日,否则我不确定这将如何工作-但是,由于它从Interval继承,因此无法做到这一点。我想这将取决于您的使用情况;如果在下游层中需要此集合,则始终可以将此属性指定为映射操作的一部分,等等。还有一个想法……如何使用自定义IPostLoadEventListener填充实体上的集合?我从来没有尝试过这样的事情,但我不明白为什么它不起作用。是的,我想知道如何使用侦听器来实现这一点-不过我希望有一个映射文件解决方案。谢谢你的输入,听起来像是答案!谢谢-我星期一会试试,可惜不行。当在查询中使用select语句时,建议只返回找到的第一个DateTime,而不是所有的DateTime。太糟糕了,我实际上被设置为重构一些代码,如果这样做的话;我想基于公式的属性只支持标量值。很抱歉让您走上花园之路。您的需求看起来如此简单,以至于很难相信NH没有一个简单的映射。您可以尝试在此处提问: