2009-10-01 120 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