2011-08-23 82 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(); 
    } 
}