Asp.net core 使用新的多语言映射的投影或自定义值解析器

Asp.net core 使用新的多语言映射的投影或自定义值解析器,asp.net-core,automapper,aspnetboilerplate,Asp.net Core,Automapper,Aspnetboilerplate,我正在使用最新版本的ASP.Net样板文件(3.7.2版)。我目前正在使用新的多语言实体 我在将其中一个实体自动映射到Dto时遇到问题,因为它不仅需要多语言特性,而且还需要其中一个属性的投影/自定义解析器 到目前为止,所有映射都正常工作。我遵循了在 [表(“分类项目”)] 公共类类别项:基类,非多语言性 { /// ///获取或设置类别项的显示顺序 /// 公共int显示顺序{get;set;} /// ///获取或设置目录类别 /// 公共虚拟ICollection CatalogIt

我正在使用最新版本的ASP.Net样板文件(3.7.2版)。我目前正在使用新的多语言实体

我在将其中一个实体自动映射到Dto时遇到问题,因为它不仅需要多语言特性,而且还需要其中一个属性的投影/自定义解析器

到目前为止,所有映射都正常工作。我遵循了在

[表(“分类项目”)]
公共类类别项:基类,非多语言性
{
/// 
///获取或设置类别项的显示顺序
/// 
公共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));