Как плавно отобразить карту с ограничением в HasMany - PullRequest
0 голосов
/ 16 марта 2012

Я новичок в (свободно) nHibernate.
У меня есть 3 таблицы:
Агентство
• AgencyId (pk)
• AgencyAccountNo

AgencyAccount
• AgencyId (pk) (fk -> Agency. AgencyId)
• AgencyAccountNo (pk)
• ChainId (fk -> AgencyChain.ChainId)

AgencyChain
• ChainId (pk)

AgencyAccount - это таблица версий. Каждый раз, когда Агентство изменяет новую строку AgencyAccount с увеличенным значением AgencyAccountNo.

Я пытаюсь свободно отобразить отношения в агентстве и агентской цепочке, чтобы был возвращен только текущий счет агентства, но у меня было много проблем. Я перепробовал много-много вещей, слишком много, чтобы здесь углубляться, и, похоже, не могу найти никаких примеров или документации по этому вопросу.

Каким будет ваш подход?

1 Ответ

3 голосов
/ 16 марта 2012

нормальный / простой способ Обновлено

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 });

хакерский способ, когда не используется идентификация, но некоторые другие генерации идентификаторов

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>);
        }
    }
}

Примечание :

  • это очень затрудняет вставку новых учетных записей Агентства для той же учетной записи.
  • не может показать полную историю учетных записей Агентства.
  • возможно, имеет множество тонких проблем
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...