2012-10-11 168 views
2

我試圖找出如何使用NHibernate的「性感」 映射通過代碼系統映射下面的情況。 請幫忙,因爲我一直在試圖找出一段時間沒有運氣!我正在使用組件來表示組合鍵。下面是我試圖映射的表格。NHibernate的3.3:映射多對多的關係與複合外鍵

Account 
------- 
BSB (PK) 
AccountNumber (PK) 
Name 

AccountCard 
----------- 
BSB (PK, FK) 
AccountNumber (PK, FK) 
CardNumber (PK, FK) 

Card 
------------ 
CardNumber (PK) 
Status 

這裏是我當前的嘗試(這是不工作!)

帳戶:

public class Account 
{ 
    public virtual AccountKey Key { get; set; } 
    public virtual float Amount { get; set; } 
    public ICollection<Card> Cards { get; set; } 
} 

public class AccountKey 
{ 
    public virtual int BSB { get; set; } 
    public virtual int AccountNumber { get; set; } 
    //Equality members omitted 
} 

public class AccountMapping : ClassMapping<Account> 
{ 
    public AccountMapping() 
    { 
     Table("Accounts"); 
     ComponentAsId(x => x.Key, map => 
      { 
       map.Property(p => p.BSB); 
       map.Property(p => p.AccountNumber); 
      }); 
     Property(x => x.Amount); 

     Bag(x => x.Cards, collectionMapping => 
       { 
        collectionMapping.Table("AccountCard"); 
        collectionMapping.Cascade(Cascade.None); 

        //How do I map the composite key here? 
        collectionMapping.Key(???);       
       }, 
       map => map.ManyToMany(p => p.Column("CardId"))); 

    } 
} 

卡:

public class Card 
{ 
    public virtual CardKey Key { get; set; } 
    public virtual string Status{ get; set; } 

    public ICollection<Account> Accounts { get; set; } 
} 

public class CardKey 
{ 
    public virtual int CardId { get; set; } 
    //Equality members omitted 
} 

public class CardMapping : ClassMapping<Card> 
{ 
    public CardMapping() 
    { 
     Table("Cards"); 
     ComponentAsId(x => x.Key, map => 
      { 
       map.Property(p => p.CardId); 
      }); 
     Property(x => x.Status); 

     Bag(x => x.Accounts, collectionMapping => 
     { 
      collectionMapping.Table("AccountCard"); 
      collectionMapping.Cascade(Cascade.None); 
      collectionMapping.Key(k => k.Column("CardId")); 
     }, 

     //How do I map the composite key here? 
     map => map.ManyToMany(p => p.Column(???))); 

    } 
} 

請告訴我,這是可能的!

+2

我們繼續之前:如果PK與FK相同,這種關係永遠不可能是M:M,它必須是O:O。 –

+0

你說得對。我選擇了錯誤的例子。我編輯了這個問題。你可以看看嗎? –

回答

2

你非常接近。

的,你在這兩個KeyManyToMany方法操作參數獲得IKeyMapperColumns方法,只要你想的是需要儘可能多的參數,所以:

collectionMapping.Key(km => km.Columns(cm => cm.Name("BSB"), 
             cm => cm.Name("AccountNumber"))); 
//... 
map => map.ManyToMany(p => p.Columns(cm => cm.Name("BSB"), 
            cm => cm.Name("AccountNumber")))); 
+0

感謝隊友。幫助我很多! –

相關問題