2010-05-03 35 views
4

有人可以幫助我以最好的方式映射流利的nHibernate中的以下情況嗎?地址類用於客戶端和公司。如何在SQL中最有效地存儲它?映射應該是什麼樣子?我也想過多種選擇,但我沒有足夠的經驗與NHibernate針對這些情況:實體nHibernate映射到多個不同的父實體(例如地址 - >公司,地址 - >客戶端)

  1. 使用1個地址實體和1臺和使用分母列客戶端和地址,公司地址來區分 - >如何在nHibernate中實現這個?

  2. 使用1個地址實體和2個表(ClientAddresses和CompanyAddresses) - >但我只可以在類地址

  3. 使用2個地址實體和2代表的映射定義1個表 - >不如此優雅

當我開始實施公司類,並意識到它也需要多個地址時,我就偶然發現了這個問題。到目前爲止,我有一個地址和客戶端類,它們之間有一對多的映射關係。在數據庫中,地址有一個名爲ClientId的額外列。但隨着介紹公司類我卡...

任何幫助將不勝感激。

我目前在sharparch 1.5框架,它使用自動映射和我的映射文件的工作是這樣的:

public class AddressMap : IAutoMappingOverride<Address> 
{ 
    public void Override(AutoMapping<Address> mapping) 
    { 
     mapping.Table("addresses"); 
     mapping.Id(x => x.Id, "AddressGuid") 
      .UnsavedValue(Guid.Empty) 
      .GeneratedBy.GuidComb(); 

     mapping.References(x => x.Client, "ClientGuid"); 

    } 
} 

下面一些代碼的說明這個問題:

地址

public class Address 
{ 
    public virtual string StreetLine1 { get; set; } 
    public virtual string StreetLine2 { get; set; } 
    public virtual string PostalCode { get; set; } 
    public virtual string City { get; set; } 
    public virtual string Country { get; set; } 
} 

其中有下表:

表名=地址
欄= AddressGuid,StreetLine1,StreetLine2,POSTALCODE,城市,國家

客戶

public class Client 
{ 
    public IList<Address> Addresses {get;set;} 
} 

公司

public class Company 
{ 
    public IList<Address> Addresses {get;set;} 
} 
+0

可悲的是我有相同的問題。讓我們看看我們能否得到一些指導。 – mhenrixon 2010-10-18 20:40:42

回答

0

您可以將關係建模爲多對多:許多公司到許多地址,許多客戶端到許多地址。

在這兩種貴公司和客戶端映射:

mapping.HasManyToMany(x => x.Addresses); 

這將創建兩個附加表:公司和地址之間的一對一映射,客戶和地址之間的另一個映射。

理論上,這可以允許共享的情況下(一些公司和客戶都共享具有相同的地址行),你可能不希望,但只要你的應用程序邏輯不允許這樣的事情發生,你會沒問題,你不需要用nhibernate做任何棘手的事情。

+0

嘗試過,但它並沒有持續的ADDRESS_ID到共享表 – mhenrixon 2010-10-18 21:51:30

+0

@mhenrixon然後你做錯了什麼。也許你需要在關聯上設置'Cascade.All()'? – 2010-10-18 22:12:46

+0

我有Cascade.SaveUpdate設置,我嘗試使用反向映射xml和流暢。 – mhenrixon 2010-10-19 15:04:53

1

看起來可以實現#1 NHibernate的<any>映射。請注意,在這種情況下,您不能指定外鍵約束。

an example of <any>

Fluent nHibernate syntax

+0

從未嘗試過。我確實看到了它的美,也許這就是用例。它也說要非常小心,我不知道我大部分時間都在做什麼,所以也許這不適合我? :) – mhenrixon 2010-10-19 15:05:42

+0

我認爲「小心」的說明是因爲你沒有通過這種方法獲得參照完整性(在db中強制執行)。只要你意識到這一點,你應該沒問題。 – 2010-10-19 15:33:43

相關問題