Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate映射责任模式_Nhibernate_Mapping_Design Patterns - Fatal编程技术网

Nhibernate映射责任模式

Nhibernate映射责任模式,nhibernate,mapping,design-patterns,Nhibernate,Mapping,Design Patterns,我正在实施福勒的责任模式。我有一个Party,子类是User和PeopleGroup。我有责任感和责任感类型。我将Party映射为一个表,而User和PeopleGroup都映射为单独的表。最后还有一个问责与政党对照表 所以这一切都很好,但问题是。 如果我找一个人群说 pg.ChildAccountablities.Where(x=>x.PartyType == "User") 因此,获得所有属于User类型的参与方后,我不能将该参与方强制转换为用户。我想这是在向上投射 我之所以需要这样

我正在实施福勒的责任模式。我有一个Party,子类是User和PeopleGroup。我有责任感和责任感类型。我将Party映射为一个表,而User和PeopleGroup都映射为单独的表。最后还有一个问责与政党对照表

所以这一切都很好,但问题是。 如果我找一个人群说

pg.ChildAccountablities.Where(x=>x.PartyType == "User")
因此,获得所有属于User类型的参与方后,我不能将该参与方强制转换为用户。我想这是在向上投射

我之所以需要这样做,是因为我正在使用一个许可系统,该系统具有用户界面(IUser)来识别它。我想说的是,让所有分配给这个peoplegroup的用户都获得这个权限。但是许可系统接口需要一个带有IUser接口的类来完成任务,当然,参与方没有这个类 也许我可以这样说

_repository.Query<User>(x=>x.ParentAccountabilities.Any(y=>y.Parent == myPeopleGroup))
\u repository.Query(x=>x.ParentAccountabilities.Any(y=>y.Parent==myPeopleGroup))
但这似乎是一种迂回的方式

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

谢谢

雷夫

更新

这里有一个链接到福勒的文章

代码或者更确切地说是映射如下

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);
    }
}
公共类PartyMap:DomainEntityMap
{
公共聚会地图
{
HasManyToMany(x=>x.ParentAccountabilities).Access.CamelCaseField(前缀.下划线).LazyLoad();
HasManyToMany(x=>x.ChildAccountabilities).Access.CamelCaseField(前缀.下划线).LazyLoad();
}
}
公共类PeopleGroupMap:子类映射
{
公共人物群组地图()
{
Map(x=>x.Name);
}
}
公共类UserMap:子类映射
{
public UserLoginInfoMap()
{
Map(x=>x.LoginName);
映射(x=>x.Password);
废话废话
}
}
公共类AccountabilityMap:DomainEntityMap
{
公共问责映射()
{
参考文献(x=>x.Parent);
参考文献(x=>x.Child);
参考文献(x=>x.AccountabilityType);
}
}
公共类AccountabilityTypeMap:DomainEntityMap
{
公共责任类型映射()
{
Map(x=>x.Name);
}
}
DomainEntityMap只是DomainEntity的一个映射,所有实体都从中继承,它包含一些基本的内容,如创建日期修改日期等


thx

责任守则会有所帮助,但我想它提到了懒散的政党。NH然后创建一个从party派生的代理来表示lazyloaded party实例。可能的解决办法

  • 禁用延迟加载参与方引用
  • 将引用更改为referenceany(FluentMapping)/any(hbm mapping)

  • 谢谢你的回复。我不确定急切的装载是否能让我上抛,是吗?第二,任何参考资料对我来说都是新的,但从我的阅读来看,它看起来非常棒。今天晚些时候我会试试的。我必须将party对象重构为一个接口,并去掉party,但这没关系,反正我宁愿这样做。急切加载将允许向上转换,因为没有不能向上转换的代理。ReferenceAny用于接口和基类,您不需要重构