Nhibernate 自动映射限制映射深度或延迟映射

Nhibernate 自动映射限制映射深度或延迟映射,nhibernate,lazy-loading,automapper,Nhibernate,Lazy Loading,Automapper,AutoMapper很棒,节省了很多时间,但当我开始研究应用程序的性能时,AutoMapper对性能损失负责 我正在使用NHibernate的延迟加载。大多数情况下,需要父实体而不需要访问子实体。实际上,AutoMapper试图映射尽可能多的关系,导致NHibernate延迟加载所有子实体(我看到selectn+1一直在发生) 有没有办法限制自动机的深度,或者AutoPAPLE有可能懒惰地映射子实体吗? < P>也许你应该考虑使用两个不同的DTOS;一个包含子实体,一个不包含子实体。然后,您可以

AutoMapper很棒,节省了很多时间,但当我开始研究应用程序的性能时,AutoMapper对性能损失负责

我正在使用NHibernate的延迟加载。大多数情况下,需要父实体而不需要访问子实体。实际上,AutoMapper试图映射尽可能多的关系,导致NHibernate延迟加载所有子实体(我看到selectn+1一直在发生)


有没有办法限制自动机的深度,或者AutoPAPLE有可能懒惰地映射子实体吗?

< P>也许你应该考虑使用两个不同的DTOS;一个包含子实体,一个不包含子实体。然后,您可以根据上下文从服务层返回正确的dto。

您可以对不需要加载的关联使用ignore方法

Mapper.CreateMap<User, UserDto>()
    .ForMember(dest => dest.LazyCollection, opt => opt.Ignore())
    .ForMember(dest => dest.AnotherLazyCollection, opt => opt.Ignore())
Mapper.CreateMap<UserProperty, UserPropertyDto>()
    .ForMember(dest => dest.PropertyLazyReference, opt => opt.Ignore());
return Mapper.Map<User, UserDto>(user);
Mapper.CreateMap()
.FormMember(dest=>dest.LazyCollection,opt=>opt.Ignore())
.ForMember(dest=>dest.AnotherLazyCollection,opt=>opt.Ignore())
Mapper.CreateMap()
.FormMember(dest=>dest.PropertyLazyReference,opt=>opt.Ignore());
返回Mapper.Map(用户);

对于您知道在dto中需要的关联,您应该考虑在初始查询中更有效地获取这些关联的方法,但这是一个全新的问题。

我使用先决条件来防止数据被映射

CreateMap<Team, TeamDto>()
    .ForMember(dto => dto.Users, options =>
    {
        options.PreCondition(ctx => !ctx.Items.ContainsKey(AutoMapperItemKeys.SKIP_TEAM_USERS));
        options.MapFrom(t => t.TeamUsers.Where(tu => tu.IsDeleted == false));
    })
    .ReverseMap();
CreateMap()
.FormMember(dto=>dto.Users,选项=>
{
options.predition(ctx=>!ctx.Items.ContainsKey(AutoMapperItemKeys.SKIP_TEAM_USERS));
options.MapFrom(t=>t.TeamUsers.Where(tu=>tu.IsDeleted==false));
})
.ReverseMap();
调用Map()时,我为Items字典提供不希望映射的属性的跳过键

this.mapper.Map<IEnumerable<Team>, IEnumerable<TeamDto>>(teams, opts =>
{
    opts.Items.Add(AutoMapperItemKeys.SKIP_TEAM_USERS, true);
});
this.mapper.Map(团队,选项=>
{
opts.Items.Add(AutoMapperItemKeys.SKIP\u TEAM\u USERS,true);
});
优点:

  • 可以细化不映射的属性
  • 防止使用嵌套对象映射到深度
  • 不需要重复的dto
  • 没有重复的映射配置文件

我最终使用了自定义解析器,感谢您的建议AutoMapper的最新v2版本有一个.MaxDepth(int)限制器,但我不确定这是否仅适用于递归对象结构或仅适用于深层结构。我也有完全相同的问题。好问题,AutoMapper有很多定制,所以需要定制。