使用 Automapper 3.3.1 或 4.2.1 时,我的代码运行良好。
但是在升级到 5.2.0 后,我在 AutoMapper.QueryableExtensions.ExpressionBuilder.DestinationConstructorExpression 中得到 ArgumentException:“类型‘System.String’没有默认构造函数”。
我们有一个支持多种语言的遗留数据库,在我们的 EF6 模型中,我们使用 LocalizedString 复杂类型来保存每个字符串属性的所有翻译值。基于这篇文章。
示例代码:
static void Main(string[] args)
{
Mapper.Initialize(p =>
{
CreateCustomMappingForLocalizedString(p);
p.CreateMap<Country, CountryViewModel>();
}
);
var db = new DemoContext();
var countries = db.Country.ProjectTo<CountryViewModel>(new {lang = "nb"}).ToList();
foreach (var c in countries)
Console.WriteLine($"{c.CountryId} : {c.CountryCode} : {c.CountryName}");
Console.WriteLine("Press <ENTER> to continue");
Console.ReadLine();
}
LocalizedString 的自定义映射是
public static void CreateCustomMappingForLocalizedString(IMapperConfigurationExpression cfg)
{
string lang = null;
// Create MAP for LINQ Projections
cfg.CreateMap<LocalizedString, string>()
.ProjectUsing(src =>
lang == "en"? src.ValueEn :
lang == "da"? src.ValueDa :
lang == "nn"? src.ValueNnNo :
lang == "sv"? src.ValueSv :
lang == "de" ? src.ValueDe :
lang == "fi"? src.ValueFi :
lang == "se"? src.ValueSeNo :
src.ValueNo);
cfg.CreateMap<LocalizedString, string>()
.ConvertUsing(src =>
Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "en" ? src.ValueEn :
Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "da" ? src.ValueDa :
Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "nn"? src.ValueNnNo :
Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "sv"? src.ValueSv :
Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "de"? src.ValueDe :
Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "fi"? src.ValueFi :
Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName == "se"? src.ValueSeNo :
src.ValueNo);
}
从 4.2.0 迁移到 5.2.0 的唯一变化是将 CreateCustomMappingForLocalizedString 中的参数类型从 IMapperConfiguration 更改为 IMapperConfigurationExpression。
我在这里使用 Automapper 5.2.0 做错了什么还是 Automapper 中的错误?
我在我的 GitHub存储库中放置了一个包含 3.3.1、4.2.1 和 5.2.0 版本的单独项目的小型示例解决方案。