2010-07-09 556 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映射中。