如何在HasMany中流畅地映射约束 [英] How to Fluently map with constraint in HasMany

查看:124
本文介绍了如何在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆