2009-05-19 85 views
4

我的數據庫結構看起來是這樣的:NHibernate的地圖許多一對多連接表

Person 
    Id 
    Name 
    FieldA 
    FieldB 

Phone 
    Id 
    Number 

PersonPhone 
    PhoneId 
    PersonId 
    IsDefault 

的人我的NHibernate的映射和電話的對象是直線前進,其PersonPhone我有困難的。我希望將PersonPhone對象的集合作爲Person的一個屬性,這將允許我擁有某個人的電話號碼,並能夠確定哪個是某個人的「默認」或主要電話號碼。

理想編號像我PersonPhone物體看起來像這樣:

public class PersonPhone 
{ 
    public virtual Person Person { get; set; } 
    public virtual Phone Phone { get; set; } 
    public virtual bool IsDefault { get; set; } 
} 

到目前爲止我對這個表NHibernate的映射如下所示:

<class name="PersonPhone" table="PersonPhone"> 
    <composite-id> 
     <key-property name="Person" column="PersonId" /> 
     <key-property name="Phone" column="PhoneId" /> 
    </composite-id> 
    <property name="IsDefault" column="IsDefault"/> 
</class> 

但是當NHibernate的編譯我的映射我得到錯誤說:

無法編譯映射文檔:MyApp.Entities.PersonPhone.hbm.xml。 NHibernate.MappingException:無法確定類型:MyApp.Entities.Person,MyApp.Entities,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null,對於列:NHibernate.Mapping.Column(PersonId)

任何這應該如何映射的想法?

回答

7

答案就在你的組合鍵使用的元素,而不是關鍵屬性

<class name="PersonPhone" table="PersonPhone"> 
    <composite-id> 
     <key-many-to-one name="Person" column="PersonId"></key-many-to-one> 
     <key-many-to-one name="Phone" column="PhoneId"></key-many-to-one> 
    </composite-id> 
    <property name="IsDefault" column="IsDefault"/> 
</class> 
+4

將是巨大的,如果有人能翻譯這FluenNHibernate ... – sydneyos 2011-03-05 23:34:58

3

我覺得這是更適當的考慮多到許多電話和庇隆實體和擺脫關係PersonPhone實體。

+1

沒有PersonPhone實體我就沒有代表的辦法IsDefault屬性。 – 2009-06-23 10:59:06

3

要建立與功能NHibernate相同的映射,這樣做:

public class PersonPhoneMap : ClassMap<PersonPhone> 
{ 
    public PersonPhoneMap() 
    { 
     CompositeId() 
      .KeyReference(p => m.Person) 
      .KeyReference(p => m.Phone); 

     References(p => p.Person) 
      .Column("PersonID"); 
     References(m => m.Phone) 
      .Column("PhoneID"); 
     Map(p => p.IsDefault) 
      .Column("IsDefault"); 
    } 
}