2012-03-29 92 views
1

我的加入(遗留,不能改变)架构中有用户和UserAddress之间的一对一的关系,具有复合键:nHib 3.2映射由码对复合键

Users: 
- username (PK) 
- email (PK) 
- firsname 
- lastname 

UsersAddresses: 
- username (PK, FK) 
- email (PK, FK) 
- city 
- street 

我的原想法是使用一个<join,使他们都到同一个类:

public class UserDTO 
    { 
     public string Username { get; set; } 
     public string Email { get; set; } 

     public string FirstName { get; set; } 
     public string City { get; set; } 
     //etc... 

    } 

,但我不知道的映射:

Join("UsersAddresses", j=> 
       { 
        j.Table("UsersAddresses"); 
        j.Fetch(FetchKind.Join); 
        j.Optional(false); 
        j.Key(k=> 
          { 
        //What here???           
        k.Column(c=> 
         { 
          c.Name(""); 
          c.Name(""); 
         }); 
        k.ForeignKey(""); 
        k.ForeignKey(""); 
       }); 

           }); 

有没有办法做到这一点?或者,也许我应该选择一个组件或一对一的映射...

回答

0

尝试使用Columns而不是Column - 它需要任意数量的列映射lambda来允许跨多列的映射对象,如您的密钥:

Join("UsersAddresses", j => 
{ 
    j.Table("UsersAddresses"); 
    j.Fetch(FetchKind.Join); 
    j.Optional(false); 
    j.Key(k => 
    { 
     k.Columns(c => 
     { 
      c.Name("username"); 
      c.ForeignKey("username_fk"); 
     }, c => 
     { 
      c.Name("email"); 
      c.ForeignKey("email_fk"); 
     }); 
    }); 
}); 
+0

'c'是IColumnMapper类型,它没有定义'ForeignKey'函数。任何其他想法? – 2012-04-01 08:19:56

+0

嗯,你是对的。所以看起来没有办法为组合键定义外键名称。但是,为什么你在意,你说过你的数据库是遗留的,不能改变,只有在模式导出的情况下才需要设置外键名,ForeignKey才是你需要的。 – NOtherDev 2012-04-01 08:53:34

+0

哦,所以在我对代码映射的理解中存在一些根本性的缺失:我如何告诉NHib'UsersAddresses'中的哪一列引用'Users'中的哪一列? (即'username - > username_fk'等) – 2012-04-01 09:33:48