2010-07-09 642 views
2

我有一个名为WorkingDays的类,这个类需要一个日期的集合,这是银行假期的日期。在我们的数据库中,我们有一个包含这些日期的表格 - 我希望nhibernate获取所有这些日期并填入bankHolidays集合。NHibernate映射集合没有外键

但是,我没有一张代表数据库链接的表 - 当所有的WorkingDays impls都会有完全相同的银行假期日期列表时,这似乎没有必要。

那么如何映射这个而不需要添加外键呢?我希望下面的代码可以更好地说明:

public class WorkingDays : Interval 
{ 
    public ICollection<DateTime> BankHolidays 
    { 
     get; 
     private set; 
    } 
} 

回答

1

是否有这样的理由,您需要这个实体本身的集合?为什么不有一个单独的存储库/ DAO负责访问这个集合?如果数据相当静态,那么也可以通过使用二级缓存来获得相当多的数据。

+0

我不知道这将如何工作,除非我加载DateTimes并将它们传递给WorkingDays - 但是因为它从Interval继承将无法做到这一点。 – Gareth 2010-07-09 16:07:44

+0

我想这将取决于您的使用情况;如果在下游图层中需要此集合,则始终可以将此属性分配为映射操作的一部分,等等。 – DanP 2010-07-09 17:08:00

+0

还有一个想法...如何在实体上填充集合的自定义IPostLoadEventListener?我从来没有尝试过这样的事情,但我不明白为什么它不起作用。 – DanP 2010-07-09 17:22:19

1

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

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

听起来像是答案!谢谢 - 我会在星期一试试 – Gareth 2010-07-10 07:33:49

+0

不幸的是,它没有奏效。在建议的查询中使用select语句时,只会返回找到的第一个DateTime,而不是全部 – Gareth 2010-07-12 13:40:21

+0

太糟糕了,实际上,我设置为重构一些代码,我想只有标量值支持基于公式的属性。 – DanP 2010-07-12 13:43:27

0

我有一个similar question我想我会附和帮助别人的未来。

我不认为你可以强制NHibernate映射与数据库中的父级没有某种关系的子级。这是一个对象关系映射器毕竟。

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