如何在HasMany中流畅地映射约束 [英] How to Fluently map with constraint in HasMany
问题描述
我是新手(流利)nHibernate。
我有3个表:
机构
•AgencyId(pk)
•AgencyAccountNo
AgencyAccount
•AgencyId(pk)(fk - > Agency。AgencyId)
•AgencyAccountNo pk)
•ChainId(fk - > AgencyChain.ChainId)
AgencyChain
•ChainId(pk)
AgencyAccount实际上是一个版本控制表。每当代理机构更改一个新的AgencyAccount行,并增加AgencyAccountNo。
我试图流利地映射Agency和AgencyChain中的关系,以便只返回Current AgencyAccount,但是遇到了很多麻烦。我尝试了很多很多东西,不能进入这里,似乎也找不到任何例子或文件。
您的方法是什么?
正常/简单way更新 类AgencyMap:ClassMap< Agency>
{
public AgencyMap()
{
Id(a => a.Id);
地图(a => a.AccountNo);
}
}
class AgencyAccountMap:ClassMap< AgencyAccount>
{
public AgencyAccountMap()
{
CompositeId()
.KeyReference(aa => aa.Agency,AgencyId)
.KeyProperty (aa => aa.AccountNo,AgencyAccountNo);
参考文献(a => a.Chain).Column(chainid);
}
}
class AgencyChainMap:ClassMap< AgencyChain>
{
public AgencyChainMap()
{
Id(c => c.Id);
HasMany(c => c.AgencyAccounts)
.KeyColumn(chainid)
//仅获得实际的AgencyAccounts
。 Where(AgencyAccountNo =(SELECT a.AgencyAccountNo FROM Agency a WHERE a.AgencyId = AgencyId));
//或者只对Agency有兴趣(使用Set来防止来自agencyaccounts历史的重复)
HasManyToMany(c => c.Agencys)
.Table (AgencyAccount)
.ParentKeyColumn(chainid)
.ChildKeyColumn(agencyid)
.AsSet();
var account = session.Get< AgencyAccount>(new AgencyAccount {Agency = agency,AccountNo = agency.AccountNo});
不使用Identity但是使用其他一些id代码的方式
class AgencyMap:ClassMap< Agency>
{
public AgencyMap()
{
表(AgencyAccount);
Id(a => a.Id,AgencyId)。GeneratedBy.Sequence(agency_id_sequence); //例如序列
其中(AgencyAccountNo =(SELECT a.AgencyAccountNo FROM Agency a WHERE a.AgencyId = AgencyId));
地图(a => a.AccountNo);
Join(Agency,join =>
{
join.KeyColumn(AgencyId);
join.Map(< some other prop> );
}
}
}
:
- 这使得为同一账户插入新的AgencyAccounts非常困难
- 显示AgencyAccounts的完整历史记录
- 可能存在许多微妙问题
I’m new to (fluent) nHibernate.
I have 3 tables:
Agency
• AgencyId (pk)
• AgencyAccountNo
AgencyAccount
• AgencyId (pk) (fk -> Agency. AgencyId)
• AgencyAccountNo (pk)
• ChainId (fk -> AgencyChain.ChainId)
AgencyChain
• ChainId (pk)
AgencyAccount is effectively a versioning table. Everytime an Agency changes a new AgencyAccount row with an incremented AgencyAccountNo.
I am trying to fluently map the relationships in Agency and AgencyChain so that only the Current AgencyAccount will be returned, but have had a lot of trouble. I have tried many, many things, too numerous to go into here, and can’t seem to find any examples or documentation on this.
What would your approach be?
the normal/easy way Updated
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 });
the hackish way when not using Identity but some other id generation
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>);
}
}
}
Note:
- this makes inserting new AgencyAccounts for the same Account very difficult
- cant show the complete history of AgencyAccounts
- possibly has a lot of subtle problems
这篇关于如何在HasMany中流畅地映射约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!