Asp.net core 使用新的多语言映射的投影或自定义值解析器
我正在使用最新版本的ASP.Net样板文件(3.7.2版)。我目前正在使用新的多语言实体 我在将其中一个实体自动映射到Dto时遇到问题,因为它不仅需要多语言特性,而且还需要其中一个属性的投影/自定义解析器 到目前为止,所有映射都正常工作。我遵循了在Asp.net core 使用新的多语言映射的投影或自定义值解析器,asp.net-core,automapper,aspnetboilerplate,Asp.net Core,Automapper,Aspnetboilerplate,我正在使用最新版本的ASP.Net样板文件(3.7.2版)。我目前正在使用新的多语言实体 我在将其中一个实体自动映射到Dto时遇到问题,因为它不仅需要多语言特性,而且还需要其中一个属性的投影/自定义解析器 到目前为止,所有映射都正常工作。我遵循了在 [表(“分类项目”)] 公共类类别项:基类,非多语言性 { /// ///获取或设置类别项的显示顺序 /// 公共int显示顺序{get;set;} /// ///获取或设置目录类别 /// 公共虚拟ICollection CatalogIt
[表(“分类项目”)]
公共类类别项:基类,非多语言性
{
///
///获取或设置类别项的显示顺序
///
公共int显示顺序{get;set;}
///
///获取或设置目录类别
///
公共虚拟ICollection CatalogItems{get;set;}=new HashSet();
...
///
///获取或设置所有实体转换
///
公共虚拟ICollection转换{get;set;}=new HashSet();
}
[表(“分类项目翻译”)]
公共类类别项翻译:IEntityTranslation
{
///
///获取或设置类别项名称
///
公共字符串CategoryItemName{get;set;}
///
///获取或设置指向类别项的链接
///
公共类别项目核心{get;set;}
///
///获取或设置指向核心Id的链接
///
public int CoreId{get;set;}
///
///获取或设置语言
///
公共字符串语言{get;set;}
}
公共类ReadCategoryItemFilterTo:PhantomEntityDto
{
公共字符串CategoryItemName{get;set;}
...
公共int ItemCount{get;set;}
...
}
在ApplicationModule类的初始化中使用创建多语言映射代码:
cfg.createMultilingarMap(新的MultilingarMapContext(IocManager.Resolve());
翻译实体中的CategoryItemName正确映射到ReadCategoryItemFilterTo上的CategoryItemName
现在我需要将CatalogItems计数映射到Dto上的ItemCount
我已尝试将以下内容添加到映射配置器:
cfg.CreateMap()
.ForMember(dest=>dest.ItemCount,opts=>opts.MapFrom(src=>src.CatalogItems.Count));
及
cfg.CreateMap()
.FormMember(dest=>dest.ItemCount,opts=>opts.ResolveUsing(new CatalogItemFilterCountResolver());
使用
公共类CatalogItemFilterCountResolver:IValueResolver
{
公共int解析(CategoryItem源、ReadCategoryItemFilterDto目标、int m、ResolutionContext上下文)
{
返回source.CatalogItems.Count;
}
}
如果我在CreateMultilanguage映射之前添加此映射,CatalogItemName映射正确,但ItemCount失败。
如果我将投影或解析器放在CreateMultilanguage映射之后,则ItemCount映射正确,但CatalogItemName映射失败
如何创建映射配置文件以允许映射这两个属性
谢谢。对于您的案例,您不需要使用扩展名
createmulti-languagemap
。
您可以创建自己的映射定义,其中包括多语言映射
就是这样做的
configuration.CreateMap()
.BeforeMap((源、目标、上下文)=>
{
var translation=source.Translations.FirstOrDefault(pt=>pt.Language==CultureInfo.CurrentUICulture.Name);
if(翻译!=null)
{
context.Mapper.Map(翻译,目的地);
返回;
}
var multilingarmapcontext=新的multilingarmapcontext(IocManager.Instance.Resolve());
var defaultLanguage=multilingMapContext.SettingManager.GetSettingValue(LocalizationSettingNames.defaultLanguage);
translation=source.Translations.FirstOrDefault(pt=>pt.Language==defaultLanguage);
if(翻译!=null)
{
context.Mapper.Map(翻译,目的地);
返回;
}
translation=source.Translations.FirstOrDefault();
if(翻译!=null)
{
context.Mapper.Map(翻译,目的地);
}
}).ForMember(dest=>dest.ItemCount,opts=>opts.MapFrom(src=>src.CatalogItems.Count));
configuration.createMultilingarMap(上下文)
.EntityMap.FormMember(dest=>dest.ItemCount,opt=>opt.MapFrom(src=>src.CatalogItems.Count));
谢谢,但是CategoryItemTranslation实体和ReadCategoryItemFilterDto之间的自动映射仍然存在错误。它对未映射的属性(包括ItemCount)不满意。我尝试为所有这些属性添加FormMember,但没有效果。您需要忽略dto中所有不存在的属性。忽略(record=>record.Field)
我尝试添加。对于AllotherMembers(opts=>opts.ignore())代码>在BeforeMap之后。但是,错误仍然表明映射在BeforeMap的context.Mapper.Map(translation,destination)
行失败。谢谢。好的,我已经解决了。我还必须在Transaltion实体和Dto以及接受的答案之间添加另一个映射。所以在我的例子中:cfg.CreateMap().formMember(dest=>dest.CategoryItemName,opts=>opts.MapFrom(src=>src.CategoryItemName)).ForAllOtherMembers(opts=>opts.Ignore())代码>是必需的。感谢您的帮助。这在最新版本的框架中解决了这个问题。然而,这在我当时开发的版本(v3.7.2)中是不可能的。
configuration.CreateMultiLingualMap<CategoryItem, CategoryItemTranslation, ReadCategoryItemFilterDto>(context)
.EntityMap.ForMember(dest => dest.ItemCount, opt => opt.MapFrom(src => src.CatalogItems.Count));