2013-03-19 65 views
0

考慮這兩個類之間的關係如何引用NHibernate的關係的class和id屬性

public class Order 
{ 
    public int OrderId {get;set;} 
    public int CustomerId {get;set;} // Should this be here? 
    public Customer Customer{get;set} 
} 

public class Customer 
{ 
    public int CustomerId {get;set;} 
    public string Name {get;set;} 
} 

我明白,我不需要在訂購客戶編號財產,我同意這不是最美麗的面向對象的做事方式。只有客戶財產,我可以輕鬆請求Order.Customer.CustomerId獲取客戶的Id。

但在這種情況下,NHibernate的,將觸發對數據庫的請求加載客戶和有我需要的只是秩序客戶編號一些(其實很多)病例。在這種情況下,CustomerId訂單類將是有用的,並將需要較少的數據庫訪問。 (如果我對此有錯,請糾正我)。

問題1:有沒有辦法告訴NHibernate,我希望兩個屬性總是更新?

酒店客戶編號總是有客戶和財產客戶的Id將被懶加載只有當我想(比方說,以獲得客戶的名字)。 Microsoft Entity Framework允許這樣做。

問題2:如果不可能,我應該擔心這個嗎?

UPDATE

繼答案說明我做了一個試驗試圖檢查原因(對我來說)如預期NHibernate的不工作,發現一些有趣的事情:NHibernate的默認不會在訂購訪問數據庫.Customer.CustomerId如果我不使用Accessor.Field映射 CustomerId屬性。

使用默認的訪問器,它按預期工作。任何想法爲什麼?

+0

對於order.customer.id發出對數據庫的調用是錯誤的。我會建議放棄你的外鍵。因此,q1和q2是多餘的 – Rippo 2013-03-20 07:27:37

+0

@Rippo:我在penfold的回答中發表了同樣的評論:我可能做了一些錯誤的事情,但在測試中,A.B.Id確實擊中了數據庫。是關於多對一的映射嗎?它是否渴望? – 2013-03-20 11:58:49

+0

@RogerKiihl:沒有看到映射和測試代碼,這是不可能告訴的。請問你可以用這些類的映射和你使用的測試代碼來更新你的問題嗎? – mickfold 2013-03-20 12:30:08

回答

4

NHibernate的默認行爲是在只訪問Id時不加載對象。另一個問題已經回答了我在下面引用的這個here

如果您從數據庫中檢索A,那麼訪問A.B.Id這將不會觸及數據庫。如果您訪問除Id字段以外的任何其他屬性,則會導致NHibernate從數據庫中檢索B.

因此,在總結進行調用Order.Customer.CustomerId不會觸發NHibernate的查詢DB的行中的客戶表與CustomerId,因此最好是從您的訂單類別中刪除客戶ID。

+0

我可能做錯了事,但在測試中,A.B.Id確實擊中了數據庫。是關於多對一的映射嗎?它是否渴望? – 2013-03-20 11:58:09

+0

經過一些測試後,我能夠驗證答案是否正確。但是,當映射的id屬性(Customer.CustomerId)使用默認存取器映射時,該默認行爲有效(仍然不知道爲什麼)。 – 2013-03-20 13:01:34

+0

@RogerKiihl我對此非常驚訝,因爲訪問類型不應該影響延遲加載。唯一會影響它的是'lazy =「no-proxy」'。 – mickfold 2013-03-20 13:17:50

1

只有一個屬性是可寫的。我建議兩個這樣的映射(我們使用這種方法):

public int CustomerId {get;set;} // Should this be here? 
public Customer Customer{get;set} // Answer: yes 

映射

<many-to-one name="Customer" column="CustomerId" /> 
<property name="CustomerId" column="CustomerId" insert="false" update="false" /> 

現在你可以在閱讀操作以同樣的方式與這兩個屬性操縱(例如過濾)。分離訂單的出價必須設置爲Customer,而CustomerId是隻讀的。

因此,對於寫入操作,您可以(也應該)只使用一個屬性。

好處是,如果您只需要過濾客戶ID,則您不必操縱客戶(對象,表)。

+0

thx答案。我真的希望像penfold這樣的回答能起作用(試圖)。但是你的方法會有很大幫助! – 2013-03-20 12:00:50