2012-03-16 46 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