Nhibernate映射责任模式

时间:2012-02-06 18:35:38

标签: nhibernate mapping design-patterns

我正在实施福勒的问责制模式。我有Party子类User和PeopleGroup。我有Accountability and AccountabilityType。我将Party映射为表,User和PeopleGroup都映射为单独的表。最后是一个Accountability_Party交叉引用表。

所以这一切都很好,但是,这就是问题所在。 如果我找到一个人组并说

pg.ChildAccountablities.Where(x=>x.PartyType == "User")
因此,如果获得所有类型为User的参与方,我就无法将该聚会转交给用户。我想这是向上倾斜。

我需要这样做的原因是因为我正在使用具有User(IUser)接口的权限系统来识别它。我想说让所有分配给这个人员组的用户并给他们这个权限。但是,许可系统接口需要一个带有IUser接口的类来进行分配,当然Party没有 也许我可以说像

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

但这似乎是一种迂回的做法。

对此问题的任何想法或见解将不胜感激。

谢谢,

RAIF

更新

此处是福勒的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

1 个答案:

答案 0 :(得分:2)

问责制的代码会有所帮助,但我猜它有一个懒惰的派对参考。然后,NH创建从派对派生的代理来表示延迟加载的派对实例。可能的解决方案

  1. 禁用延迟加载Party参考
  2. 将引用更改为referenceany(FluentMapping)/ any(hbm mapping)