2011-09-06 61 views
2

你如何處理NHibernate的查找值?例如,我有一個Order實體,它有一個BillingAddress屬性,它是一個名爲Address的值對象,如果Address對象只包含State和Country屬性作爲字符串,則很簡單。但是如果我想要一個國家包含其狀態列表,則訂單表單可以填充每個選定國家的適當狀態下拉列表。如何使用NHibernate查找值?

我還可以創建Country和State作爲值對象嗎?或者他們必須是實體?如果它們是實體,Address可以作爲一個值對象嗎?

下面是我的示例的示例代碼:

public class Order 
{ 
    public virtual int OrderId { get; set; } 
    public virtual Address BillingAddress { get; set; } 
} 

public class Address 
{ 
    public virtual State State { get; set; } 
    public virtual Country Country { get; set; } 
} 

public class Country 
{ 
    public virtual string Name { get; set; } 
    public virtual ICollection<State> States { get; set; } 
} 

public class State 
{ 
    public virtual string Name { get; set; } 
    public virtual Country Country { get; set; } 
} 
+0

你可以開車試圖模擬地址數據。郵政編碼特別艱難,因爲它們經常不遵循政治邊界。儘可能保持簡單。 –

+0

可能是:),但我如何根據當前選定的國家填充狀態列表?我知道你們大多數人都只熟悉一個州的名單:美國的州,但我不是來自美國,我想爲幾個國家提供同樣的功能。 –

+0

許多(大多數?)國家的地址中不包括州/省。您可以從ISO 3166國家(http://bit.ly/qKq0iB)和細分(http://bit.ly/qS88i9)代碼開始。然後訪問各個國家的郵政服務,瞭解如何格式化他們的地址。我的數據幾乎都是美國和加拿大的地址,因此我把地址視爲美國,加拿大或國際。美國和CA(鬆散地)驗證,國際地址不是。所以我有方法獲取州或省列表,具體取決於是否選擇US或CA。 –

回答

1

如果你想查找數據存儲在數據庫中,那麼他們需要的實體。否則,這取決於你。如果你這樣做,我建議將它們標記爲不可變的,並將它們放在只讀的第二層緩存中。

如果您將它們存儲爲值,並且它們具有Abbrevation,Name,Coordinates等多個字段,則可以將該ID保存爲數據存儲中的值,並將查找數據硬編碼爲純文本C#類。您只需從NHibernate中檢索id值,然後您的調用代碼將不得不在類上運行查找方法。不夠優雅,但從NHibernate /數據庫的角度簡化。

兩種方法都可以接受 - 更多取決於您計劃如何使用它們:誰在維護和使用每個級別的代碼,您想要緩存和/或查找代碼的位置,是否控制調用代碼或不是,等等。

+0

感謝您的回答,我像往常一樣使用簡單的方法:狀態和國家都是字符串,用戶從硬編碼查找列表填充的下拉列表中選擇它們。 –