2012-10-04 88 views
1

我以爲我有這個中間表作爲HasMany映射中間表和HasOne中間和子之間的映射,但HasOne希望共享密鑰。 (無反選項:[)與中間表的一對多映射

總之,關係結構,我有:

地址(兒童)
AddressId
..Address場

AddressCustomer(中介)
AddressCustomerId
AddressId
CustomerId

客戶(家長)
客戶編號
..Customer場

爲什麼我有這樣的中介表,而不是一個正常的一對多的?因爲會有其他實體需要包含地址。 (即網站等)他們將擁有自己的中間表,以便他們可以共享地址表。

映射我到目前爲止有:

public class CustomerAddressMap : ClassMap<CustomerAddress> 
{ 
    public CustomerAddressMap() 
    { 
     Schema("dbo"); 
     Table("CustomerAddress"); 
     Id(x => x.CustomerAddressId); 
     Map(x => x.FromDate) 
      .Not.Nullable(); 
     Map(x => x.ToDate); 
     HasOne(x => x.Address) 
      .ForeignKey("AddressId") 
      .Cascade.All(); 
    } 

} 

public class AddressMap : ClassMap<Address> 
{ 
    public AddressMap() 
    { 
     Schema("dbo"); 
     Table("Address"); 
     Id(x=>x.AddressId); 
     Map(x => x.AddressType); 
    } 
} 

隨着在CustomerAddress表爲空的AddressId列,行插入,但是AddressID從地址行不傳播回升到CustomerAddress。 HasOne沒有逆向選項,因此似乎是死路一條。我無法在CustomerAddress上生成Address ID,因爲一旦添加了諸如SiteAddress之類的東西並且必須執行相同的操作,這會導致重複。那招可能使用GUID作爲鍵,但我暫時與自動增量Ints卡住。

我正在討論的一些其他想法是映射CustomerAddress和Address的合併,但我不認爲Fluent NHibby支持這種想法。

我認爲這是某人已成功應用的問題域。基本上我想要一個一對多的關係,其中子表(不是記錄)在多個父母之間共享。有任何想法嗎?

+0

更新:嘗試一些事情還沒有完美的解決方案後。我也嘗試過切換AddressID爲GUID並設置它作爲一個。參照(),而不是.HasOne(),其中CustomerAddress和網站地址(加入驗證它工作)負責生成地址ID。它的工作原理,但我不知道我可以買入允許GUID PK/FK地址細節。 如果周圍有引用或類似的東西,使地址生成它自己的鑰匙,而且是更新CustomerAddress/SiteAddress我會興高采烈的一個可能的解決方案。 –

回答

1

映射它作爲正常的引用

public class CustomerAddressMap : ClassMap<CustomerAddress> 
{ 
    public CustomerAddressMap() 
    { 
     Table("CustomerAddress"); 

     Id(x => x.CustomerAddressId); 
     Map(x => x.FromDate).Not.Nullable(); 
     Map(x => x.ToDate); 
     References(x => x.Customer, "CustomerId"); 
     References(x => x.Address, "AddressId"); 
    } 
} 
+0

胡人的修修補補,以讓它使用GUID工作,我認爲它實際上應該與INT ID的工作方式,所有我所要做的就是切換回類型,沒想到它會工作。謝謝 :) –

0

爲什麼不從地址到客戶進行一對多?客戶將包含外鍵,地址實體可由其他實體引用。在這種情況下,您只需在客戶表上製作References(x => x.Address);
當我嘗試使用FluentNHibernate創建一對一關係時,我也遇到了一些常見問題。如果你想離開DB結構爲你呈現,我想你應該嘗試下面的映射(與添加相應的實體領域):在我的情況下離開了一面空

public AddressMap() 
{ 
    Schema("dbo"); 
    Table("Address"); 
    Id(x => x.AddressId); 
    Map(x => x.AddressType); 
    HasOne(x => x.CustomerAddress).Cascade.All(); 
} 
public CustomerAddressMap() 
{ 
    Schema("dbo"); 
    Table("CustomerAddress"); 
    Id(x => x.CustomerAddressId); 
    Map(x => x.FromDate) 
     .Not.Nullable(); 
    Map(x => x.ToDate); 
    HasOne(x => x.Address) 
    .Constrained() 
    .ForeignKey(); 
} 

這樣的映射,所以我修改的屬性設置爲孩子實體(CustomerAddress):

public virtual Address Address 
{ 
    get { return _address; } 
    set 
    { 
     _address = value; 
     value.CustomerAddress = this; 
    } 
} 

這些行爲之後一對一工作正常)希望它能幫助你解決問題。