2009-07-13 73 views
2

我有兩個理論域對象:一一對一映射與NHibernate /使用實體作爲PK

公共類Person { 公共虛擬INT標識{獲得;私人設置; }}

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() { Id(x => x.Id); } 
} 

public class DriversLicense 
{ 
    public virtual Person Person { get; set; } 
    public virtual string State { get; set; } 
} 

public class DriversLicenseMap : ClassMap<DriversLicense> 
{ 
    public DriversLicenseMap() 
    { 
     References(x => x.Person); 
     Map(x => x.State); 
    } 
} 

當Person對象是用作上DriversLicense的PK。我不希望Person對象具有DriversLicense的任何知識,因此這種關係在DriversLicense類中嚴格維護。每個人只有一個駕駛執照。

當設置這種方式,我發現了以下異常:

System.Xml.Schema.XmlSchemaValidationException: 在命名空間 元素「類」「甕:NHibernate的映射 - 2.2」具有 命名空間中的無效子元素'property' 'urn:nhibernate-mapping-2.2'。列表 可能的元素預期:'meta, jcs-cache,cache,id,composite-id'in namespace 'urn:nhibernate-mapping-2.2'。

將Id屬性添加到DriversLicense類型可修復問題。

有沒有方法可以將Person本身用作DriversLicense表中的主鍵,以便底層表只使用Person.Id作爲其主鍵?

回答

1

@Matthieu讓我走上了正確的軌道與複合鍵。我不得不使用UseCompositeId()方法,然後覆蓋驅動程序許可證對象的等於& GetHashCode。

這裏是它的外觀在功能NHibernate:

public class DriversLicense 
{ 
     public virtual Person Person { get; set; } 
     public virtual string State { get; set; } 

     public override bool Equals(object obj) 
     { 
      if(ReferenceEquals(obj, null)) return false; 

      // Cast, instead of 'as' throws runtime exception when obj is not an 
      // DriversLicense. 
      var comp = (DriversLicense) obj; 

      if(Person == null || comp.Person == null) 
       return false; 

      return Person.Equals(comp.Person); 
     } 

     public override int GetHashCode() 
     { 
      return Account == null ? -1 : Account.GetHashCode(); 
     } 
} 

public class DriversLicenseMap : ClassMap<DriversLicense> 
{ 
     public DriversLicenseMap() 
     { 
       UseCompositeId().WithKeyReference(x => x.Person); 
       Map(x => x.State); 
     } 
}