2012-02-06 3 views
1

Я реализую шаблон ответственности Фаулера. У меня есть Party с подклассами User и PeopleGroup. У меня есть Accountability and AccountabilityType. У меня есть Партия, отображаемая как таблица, а User и PeopleGroup отображаются как отдельные таблицы. Затем, наконец, есть контрольная таблица Accountability_Party.Nhibernate mapping accountability pattern

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

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

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

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

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

но, похоже, своего рода окольного пути ведения Это.

Любые мысли или идеи по этой проблеме были бы весьма полезными.

Спасибо,

Раифа

Update

здесь ссылка на accountability pattern Фаулера.

Кроме того, код или, вернее, отображения являются

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

ответ

2

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

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

Спасибо за ваш ответ. Я не уверен, что если бы страстная загрузка позволила бы мне подняться, не так ли? Secondly ReferencesAny новичок для меня, но из того, что я читаю, он выглядит очень здорово. Я попробую это позже сегодня. Я должен реорганизовать объект партии в интерфейс и избавиться от вечеринки, но это нормально. Я бы предпочел сделать это так или иначе. – Raif

+0

Загрузка с нетерпением позволит повысить эффективность, поскольку нет прокси-сервера, который не может быть оптимизирован. для интерфейсов ** и ** Baseclasses, вам не нужно рефакторировать – Firo

+0

отлично, это хорошая информация. Я ценю это. – Raif