2009-10-01 161 views
13

我有一個包含'地址'值對象的'用戶'實體。我有這個映射確定使用FNH的組件概念。但是,地址VO還包含一個國家,這是另一個值對象。我以爲這應該只是嵌套作爲另一個組件,但這似乎並不奏效。誰能告訴我我該如何解決這個問題?在Fluent NHibernate中映射嵌套組件

映射代碼低於...

謝謝!

public UserMapping() 
     { 
      Table("Users"); 
      Id(c => c.Id).GeneratedBy.HiLo("100"); 
      Map(c => c.UserName).Not.Nullable().Length(64); 
      Map(c => c.Email).Not.Nullable().Length(128); 
      Map(c => c.Password).Not.Nullable().Length(256); 
      Map(c => c.Roles).Length(64); 
      Map(c => c.FirstName).Not.Nullable().Length(64); 
      Map(c => c.LastName).Not.Nullable().Length(64); 
      Map(c => c.BirthDate).Not.Nullable(); 
      //Address 
      Component(x => x.Address, m => 
      { 
       m.Map(x => x.AddressLine1).Not.Nullable(); 
       m.Map(x => x.AddressLine2); 
       m.Map(x => x.City).Not.Nullable(); 
       m.Map(x => x.Region); 
       m.Map(x => x.PostalCode).Not.Nullable(); 
       //*****Country Here******** 
       // country has Name and Code 

      }); 
     } 

回答

13

啊,來自FNH郵件列表的Jimmy Bogard告訴我 - 這很簡單。我不知道我以前在做什麼!無論如何,對於任何其他感興趣的人:

Component(c => c.Address, m => 
{ 
    m.Component(cp => cp.Country, m2 => 
    { 
     m2.Map(x => x.Name); //etc 
    } 
+1

令人驚歎。我沒有意識到你可以像這樣嵌套它們。我一直在爲此工作一週。 – 2010-08-27 23:26:37

+0

如果我在國家/地區代替名稱和代碼(如果IdCountry是國家/地區的主要密鑰)有IdCountry,該怎麼辦? – Apocatastasis 2013-03-07 18:19:19

0

我會創建一個Country的地圖並使用m.References(x => x.Country)

+3

但是那麼會不會將國家視爲實體而不是價值對象?也許這樣做沒有壞處。 – UpTheCreek 2009-10-01 15:06:10

+2

有一個缺點。實體有自己的「生命」(影響所有選擇和更新查詢),我們不希望在這裏擁有一個獨立存在的「地址」。 – NOtherDev 2011-04-17 10:37:17