0

我有表:流利NHibernate的外鍵映射

球員
編號:INT - PrimaryKey的
名稱:字符串

BowlerType
編號:INT - PrimaryKey的
說明:字符串

PlayerBowlerType
PlayerId:整數NOT NULL外鍵引用Player.Id
BowlerTypeId:整數NOT NULL外鍵引用BowlerType.Id

玩家可以確認許多保齡球類型。繼承人一些示例數據

玩家
1 |彼得
2 |約翰

BowlerType
6 |慢
7 |快速

PlayerBowlerType
1 | 6
1 | 7
2 | 7

回答

1

這裏你需要的是一個與你的PlayerBowlerType一起使用的合成id。這樣的設置應該工作:

public class PlayerBowlerTypeId 
{ 
    public virtual int PlayerId { get; set; } 

    public virtual int BowlerTypeId { get; set; } 

    public override bool Equals(object obj) 
    { 
     return Equals(obj as PlayerBowlerTypeId); 
    } 

    private bool Equals(PlayerBowlerTypeId other) 
    { 
     if (ReferenceEquals(other, null)) return false; 
     if (ReferenceEquals(this, other)) return true; 

     return PlayerId == other.PlayerId && 
      BowlerTypeId == other.BowlerTypeId; 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      int hash = GetType().GetHashCode(); 
      hash = (hash * 31)^PlayerId.GetHashCode(); 
      hash = (hash * 31)^BowlerTypeId.GetHashCode(); 

      return hash; 
     } 
    } 
} 

public class PlayerBowlerType 
{ 
    public PlayerBowlerType() 
    { 
     Id = new PlayerBowlerTypeId(); 
    } 

    public virtual PlayerBowlerTypeId Id { get; set; } 
} 

public class PlayerBowlerTypeMap : ClassMap<PlayerBowlerType> 
{ 
    public PlayerBowlerTypeMap() 
    { 
     Table("TABLENAME"); 

     CompositeId<PlayerBowlerTypeId>(x => x.Id) 
      .KeyProperty(x => x.BowlerTypeId, "COLUMNNAME") 
      .KeyProperty(x => x.PlayerId, "COLUMNNAME"); 
    } 
} 

技術上可以做到這一點沒有身份對象(PlayerBowlerTypeId類型將被移除,並直接將代碼放入PlayerBowlerType並適當調整),但我有一些問題(3-4個獨立的錯誤)。其中一個討論here

雖然我討厭更改域對象來補償ORM系統中的錯誤,但如果您只是使用PlayerBowlerTypeId類型,它將爲您節省很多麻煩。

只要您修改映射以使用實際的表名和列名(以及您需要爲特定設置映射所做的任何其他操作),就應該可以工作。