2011-08-23 72 views
1

我有兩個表共享相同的密鑰的情況,我們只是說ID。當我用FluentMapping映射這兩個表時,我如何爲我想讓ID實際映射到對象的類進行映射。流利的nHibernate ID是一個參考

public class First 
{ 
    public virtual int Id {get; set;} 
    public virtual string Name {get; set; } 
} 


public class Second 
{ 
    public virtual First First {get; set;} 
    public virtual int Number {get; set; } 
} 

如何映射第二類?第二個表也有一個ID,但它是第一個表的ID的外鍵。

+1

在那麼,你會說'Second' *是一種* First?嗎?意義 - 就像'員工'是一種'人',或'經理人'是一種'員工'。如果是這樣 - 你會想使用繼承。 –

回答

1

像sJhonny說,這聽起來真的如繼承,這將使

class First 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

class Second : First 
{ 
    public virtual int Number { get; set; } 
} 

class FirstMap : ClassMap<First> 
{ 
    public FirstMap() 
    { 
     Id(f => f.Id).GeneratedBy.HiLo("100"); 

     Map(f => f.Name); 
    } 
} 

class SecondMap : SubclassMap<Second> 
{ 
    public SecondMap() 
    { 
     KeyColumn("Id"); 

     Map(s => s.Number); 
    } 
} 

,但您的情況也是可以的,但是你需要額外的工作,它不是那麼好代碼後

class SecondMap : ClassMap<Second> 
{ 
    public SecondMap() 
    { 
     CompositeId() 
      .KeyReference(f => f.First, "Id"); 

     Map(s => s.Number); 
    } 
} 

class Second 
{ 
    public virtual First First {get; set;} 
    public virtual int Number { get; set; } 

    // required for Compositekeys 
    public override bool Equals(object obj) 
    { 
     var other = obj as Second; 
     return (other != null) && (First.Id == other.First.Id) ; 
    } 

    // required for Compositekeys 
    public override int GetHashCode() 
    { 
     return First.Id.GetHashCode(); 
    } 
}