我在.net core 3.1项目中使用AutoMapper.Extensions.Microsoft.DependencyInjection
Nuget软件包。我的控制台应用程序代码如下(可以通过复制粘贴运行并安装AutoMapper.Extensions.Microsoft.DependencyInjection程序包以重现错误)。
我没有写任何映射。我仅将Automapper用于以下代码的克隆对象。 当我使用6.1.0软件包时,一切正常运行。但是当我升级6.1.1或7.0.0时,它给了我错误
Missing type map configuration or unsupported mapping.
Mapping types:
Foo -> FooDto
AutomapperProject.Foo -> AutomapperProject.FooDto
。
这可能是什么原因?
using AutoMapper;
namespace AutomapperProject
{
internal class Program
{
private static void Main(string[] args)
{
var foo = new Foo { Id = 1, Name = "Foo" };
var dto = MapperHelper.MapFrom<FooDto>(foo);
}
}
public static class AutomapperExtensions
{
private static void IgnoreUnmappedProperties(TypeMap map, IMappingExpression expr)
{
foreach (string propName in map.GetUnmappedPropertyNames())
{
var srcPropInfo = map.SourceType.GetProperty(propName);
if (srcPropInfo != null)
expr.ForSourceMember(propName, opt => opt.DoNotValidate());
var destPropInfo = map.DestinationType.GetProperty(propName);
if (destPropInfo != null)
expr.ForMember(propName, opt => opt.Ignore());
}
}
public static void IgnoreUnmapped(this IProfileExpression profile)
{
profile.ForAllMaps(IgnoreUnmappedProperties);
}
}
public static class MapperHelper
{
private static IMapper Mapper()
{
var mapperConfig = new MapperConfiguration(configuration=>{configuration.IgnoreUnmapped();});
return mapperConfig.CreateMapper();
}
public static T MapFrom<T>(object entity)
{
return Mapper().Map<T>(entity);
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
public class FooDto
{
public int Id { get; set; }
public string Name { get; set; }
public string Unmapped { get; set; }
}
}
答案 0 :(得分:2)
版本7.0.0中的T
软件包要求(至少)版本9.0.0中的AutoMapper.Extensions.Microsoft.DependencyInjection
软件包。版本6.1.0的AutoMapper
软件包要求(至少)版本8.1.0的AutoMapper.Extensions.Microsoft.DependencyInjection
软件包。
如9.0 Upgrade Guide所述,AutoMapper从8.0更改为9.0有一个重要更改,该更改会影响您的代码:
AutoMapper不再自动创建地图(CreateMissingTypeMaps和约定)
您将需要手动或使用反射来显式配置地图。还请考虑属性映射。
因此,对于新的AutoMapper 9.0.0,必须显式定义映射。
答案 1 :(得分:0)
如果使用Automapper软件包9.0.0或更高版本,则需要显式配置映射。正如@Progman所说。
我解决了将AutoMapper降级到8.0.0并将AutoMapper.Extensions.Microsoft.DependencyInjection降级到6.0.0版本的问题