Подотчетность картирования Nhibernate - PullRequest
1 голос
/ 06 февраля 2012

Я реализую Шаблон ответственности Фаулера.У меня есть Party с подклассами User, и PeopleGroup.У меня есть Accountability и AccountabilityType.У меня Party отображается в виде таблицы, а User и PeopleGroup отображаются в виде отдельных таблиц.И, наконец, есть таблица перекрестных ссылок Accountability_Party.

Так что все это работает нормально, однако здесь есть проблема.Если я получу группу людей и скажу

pg.ChildAccountablities.Where(x=>x.PartyType == "User")

, получая, таким образом, все Стороны типа Пользователь, я не смогу затем передать Сторону Пользователю.Я полагаю, это отвратительно.

Причина, по которой мне нужно это сделать, заключается в том, что я использую систему прав доступа, которая имеет интерфейс для пользователя (IUser) для его идентификации.Я хотел бы сказать, получить всех пользователей, назначенных для этой группы людей, и дать им это разрешение.Но интерфейс системы разрешений требует класса с интерфейсом IUser для назначения, и, конечно, у Party этого нет. Возможно, я мог бы сказать что-то вроде

_repository.Query<User>(x=>x.ParentAccountabilities.Any(y=>y.Parent == myPeopleGroup))

, но это похоже на окольный путьДелать это.

Буду признателен за любые мысли или идеи по этой проблеме.

Спасибо,

Raif

Обновление

здесь - ссылка на шаблон подотчетности Фаулера.

Также код или, скорее, сопоставления выглядят следующим образом

public class PartyMap : DomainEntityMap<Party>
{
    public PartyMap()
    {
        HasManyToMany(x =>x.ParentAccountabilities).Access.CamelCaseField(Prefix.Underscore).LazyLoad();
        HasManyToMany(x =>x.ChildAccountabilities).Access.CamelCaseField(Prefix.Underscore).LazyLoad();
    }
}

public class PeopleGroupMap : SubclassMap<PeopleGroup>
{
    public PeopleGroupMap()
    {
        Map(x => x.Name);
    }
}

public class UserMap : SubclassMap<User>
    {
        public UserLoginInfoMap()
        {
            Map(x => x.LoginName);
            Map(x => x.Password);
            blah blah blah
        }
    }

public class AccountabilityMap : DomainEntityMap<Accountability>
{
    public AccountabilityMap()
    {
        References(x => x.Parent);
        References(x => x.Child);
        References(x => x.AccountabilityType);
    }
}

public class AccountabilityTypeMap : DomainEntityMap<AccountabilityType>
{
    public AccountabilityTypeMap()
    {
        Map(x => x.Name);
    }
}

DomaineEntityMap - это просто картаDomainEntity, от которого наследуются все сущности и который имеет некоторые базовые вещи, такие как дата создания, дата изменения и т. д.

thx

1 Ответ

2 голосов
/ 07 февраля 2012

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

  1. отключить отложенную загрузку ссылки на партию
  2. изменить ссылку на ссылку любой (FluentMapping) / любой (отображение hbm)
...