[英]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.SupervisorForms
和User.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.