2012-03-16 15 views
0

我是(流利)nHibernate的新手。
我有3個表:

•AgencyId(PK)
•AgencyAccountNo如何流利地映射約束在HasMany

AgencyAccount
•AgencyId(PK)(FK - >代理AgencyId。)
•AgencyAccountNo(PK)
•ChainId(FK - > AgencyChain.ChainId)

AgencyChain
•ChainId(PK)

AgencyAccount實際上是一個版本控制表。每當代理機構更改一個新的AgencyAccount行時,代理代理帳號都會增加。

我想流利地映射在Agency和AgencyChain中的關係,以便只返回當前AgencyAccount,但遇到了很多麻煩。我嘗試了很多很多事情,但無法進入此處,並且似乎無法找到任何有關此的示例或文檔。

你的方法是什麼?

+0

對於任何人誰是有興趣;由於AgencyAccount具有組合主鍵,因此引發異常: 外鍵(FKF4659F6B49B309DE:AGENCY [AGENCY_NO]))必須與引用的主鍵(AGENCY_AC [AGENCY_NO,ACIN_NO])具有相同的列數 使用HasMany中提供的where子句@Firo會限制結果: 其中(「AgencyAccountNo =(SELECT a.AgencyAccountNo FROM Agency a WHERE a.AgencyId = AgencyId)」); – TimC 2012-03-20 22:03:59

回答

3

不使用身份,但一些其他的ID生成

class AgencyMap : ClassMap<Agency> 
{ 
    public AgencyMap() 
    { 
     Table("AgencyAccount"); 
     Id(a => a.Id, "AgencyId").GeneratedBy.Sequence("agency_id_sequence"); // e.g. sequence 

     Where("AgencyAccountNo = (SELECT a.AgencyAccountNo FROM Agency a WHERE a.AgencyId = AgencyId)"); 


     Map(a => a.AccountNo); 

     Join("Agency", join => 
     { 
      join.KeyColumn("AgencyId"); 
      join.Map(<some other prop>); 
     } 
    } 
} 

注意當正常/簡單的方法更新

class AgencyMap : ClassMap<Agency> 
{ 
    public AgencyMap() 
    { 
     Id(a => a.Id); 

     Map(a => a.AccountNo); 
    } 
} 

class AgencyAccountMap : ClassMap<AgencyAccount> 
{ 
    public AgencyAccountMap() 
    { 
     CompositeId() 
      .KeyReference(aa => aa.Agency, "AgencyId") 
      .KeyProperty(aa => aa.AccountNo, "AgencyAccountNo"); 

     References(a => a.Chain).Column("chainid"); 
    } 
} 

class AgencyChainMap : ClassMap<AgencyChain> 
{ 
    public AgencyChainMap() 
    { 
     Id(c => c.Id); 


     HasMany(c => c.AgencyAccounts) 
      .KeyColumn("chainid") 
      // to get only the actual AgencyAccounts 
      .Where("AgencyAccountNo = (SELECT a.AgencyAccountNo FROM Agency a WHERE a.AgencyId = AgencyId)"); 

     // or if only interested in Agency (using a Set to prevent duplicates coming from the history of agencyaccounts) 
     HasManyToMany(c => c.Agencys) 
      .Table("AgencyAccount") 
      .ParentKeyColumn("chainid") 
      .ChildKeyColumn("agencyid") 
      .AsSet(); 
    } 
} 

var account = session.Get<AgencyAccount>(new AgencyAccount { Agency = agency, AccountNo = agency.AccountNo }); 

的hackish的方式:

  • 這使得插入新代理帳戶非常難
  • 不能顯示AgencyAccounts的完整歷史
  • 可能有很多微妙的問題
+0

感謝您的回答。重新閱讀我的問題,我意識到我並不清楚,但沒有詳細說明,對不起。 我會將此標記爲已回答並再次提問。 – TimC 2012-03-18 22:30:28

+0

也許我可以在這裏問: 當通過屬性訪問時,第一種方法將不起作用,例如:Chain.AgencyAccounts,全部將被選中。 第二種方法將不起作用,因爲鍵中的列數不同且引發異常::外鍵(FKF4659F6B49B309DE:AGENCY [AGENCY_NO]))的列數必須與引用的主鍵相同(AGENCY_AC [AGENCY_NO ,ACIN_NO]) – TimC 2012-03-19 00:11:42

+0

我不知道該鏈有反向引用AgencyAccounts,將編輯# – Firo 2012-03-19 08:10:16