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