簡體   English   中英

流利的NHibernate和多個鍵列

[英]Fluent NHibernate and multiple key columns

我有一個具有IList屬性的User實體。 映射如下所示:

        HasMany(x => x.Forms) 
            .Cascade.None() 
            .AsBag().KeyColumn("Supervisor") 
            .Key(key => key.Not.Update()) 
            .PropertyRef("Email"); 

現在,我有一個新的功能請求,該請求本質上添加了另一個KeyColumn,也應該填充到此屬性中。 本質上,每個表單可以具有“主管”和“備用”,並且我需要此屬性來填充其中User.Email等於任一表單的任何表單(如果User.Email == Form.Supervisor OR User.Email == Form.Alternate用戶屬於User.Email == Form.Supervisor OR User.Email == Form.Alternate )。

有沒有辦法做到這一點? 簡單地添加另一個KeyColumn規范只會覆蓋前一個規范,並且通過Keys()方法添加鍵似乎不允許像我想要的那樣使用多個鍵列...我正在尋找一種基本上告訴它這種關系應該是使用WHERE Superviser = Email OR Alternate = Email ,但似乎不支持該OR子句...

我的另一個選擇是本質上重復此映射,但是對於另一個屬性中的“ Alternate”,然后在我使用的代碼中將集合一起猛擊,但是我想看看NHibernate是否足夠聰明以至於可以做到這一點...

有什么建議么?

據我所知,不-NHibernate不支持這種異常的連接類型。 我會按照您所說的那樣來處理。 使用兩個集合User.SupervisorFormsUser.AlternateForms ,然后稍后將它們組合在一起,也許使用LINQ的Concat方法來實現。 您可以定義一個屬性來為您執行此串聯:

public virtual IEnumerable<Form> Forms
{
    get { return SupervisorForms.Concat(AlternateForms); }
}

如果您希望通過一次往返數據庫將完全初始化的Forms集合加載到User ,則可以從NHibernate文檔的Improving Performace-Multi Query部分中使用此方法:

User user = s.CreateMultiQuery()
    .Add("select u from User u left join fetch u.SupervisorForms where u.Id = :id")
    .Add("select u from User u left join fetch u.AlternateForms where u.Id = :id")
    .SetInt32("id", 123)
    .UniqueResult<User>();

此代碼使用CreateMultiQuery()和HQL-但該方法應與您選擇的查詢批處理語法一樣有效: CreateMultiQuery()CreateMultiCriteria()Future() / FutureValue()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM