【问题标题】:Automapper exception: "Missing type map configuration or unsupported mapping."Automapper 异常:“缺少类型映射配置或不支持的映射。”
【发布时间】:2015-01-23 22:03:43
【问题描述】:

我正在尝试在 ASP.NET MVC 5 应用程序中使用 Ninject,该应用程序使用 AutoMapper 将模型映射到视图模型,反之亦然。 不幸的是,我收到一条错误消息,指出缺少类型映射配置。

我创建了一个 Ninject 依赖解析器:

namespace MyNamespace.Infrastructure
{
    public class NinjectDependencyResolver: IDependencyResolver
    {
        private IKernel kernel;

        public NinjectDependencyResolver(IKernel kernelParam)
        {
            kernel = kernelParam;
            AddBindings();
        }

        public object GetService(Type serviceType)
        {
            return kernel.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return kernel.GetAll(serviceType);
        }

        private void AddBindings()
        {
            kernel.Bind<IMyBLL>().To<MyBLL>();
        }
    }
}

我用它来创建一个控制器:

namespace MyNamespace.Controllers
{
    [Authorize]
    public class HomeController : Controller
    {
        private IMyBLL _myBLL;

        public HomeController(IMyBLL myBLLParam)
        {
            _myBLL = myBLLParam;
        }

        public PartialViewResult AddRecord()
        {
            return PartialView(new AddRecordViewModel());
        }

        [HttpPost]
        public void AddRecord(AddRecordViewModel recordViewModel)
        {
            var record = Mapper.Map<Record>(recordViewModel);

            _myBLL.AddRecord(record, User.Identity.Name);
        }
    }
}

全球.asax:

namespace MyNamespace.WebApplication
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            ApplicationUserManager.StartupAsync();
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AutoMapperWebConfiguration.Configure();
        }
    }
}

这会调用 AutoMapper 配置:

namespace MyNamespace.WebApplication.Infrastructure
{
    public static class AutoMapperWebConfiguration
    {
        public static void Configure()
        {
            Mapper.Initialize(cfg => cfg.AddProfile(new RecordProfile()));
        }
    }

    public class RecordProfile : Profile
    {
        protected override void Configure()
        {
            Mapper.CreateMap<AddRecordViewModel, Record>().ReverseMap();
        }
    }
}

当我运行它时,我收到以下错误消息:

Missing type map configuration or unsupported mapping.

Mapping types:
AddRecordViewModel -> Record
 MyNamespace.WebApplication.ViewModels.Home.AddRecordViewModel -> MyNamespace.Model.Record

 Destination path:
 Record

 Source value:
 MyNamespace.WebApplication.ViewModels.Home.AddRecordViewModel

我想念什么吗? 在我使用 Ninject 依赖解析器之前它运行良好。 现在它似乎没有找到映射。


编辑:

如果我将 Mapping Creation 直接添加到它工作的控制器方法中:

[HttpPost]
public void AddRecord(AddRecordViewModel recordViewModel)
{
    Mapper.CreateMap<AddRecordViewModel, Record>().ReverseMap();
    var record = Mapper.Map<Record>(recordViewModel);

    _myBLL.AddRecord(record, User.Identity.Name);
}

映射本身以及模型和视图模型似乎不是问题。我猜该程序不知何故找不到映射。

即使我在控制器方法中调用 Auto Mapper Web 配置,它仍然有效:

public void AddRecord(AddRecordViewModel recordViewModel)
{
    Infrastructure.AutoMapperWebConfiguration.Configure();

    var record = Mapper.Map<Record>(recordViewModel);

    _myBLL.AddRecord(record, User.Identity.Name);
}

【问题讨论】:

  • 您定义了一个 AddRecordViewModel -> Record 但不是相反。您需要另一个映射。
  • 我现在添加了第二个映射。不幸的是,我仍然收到相同的错误消息。程序似乎找不到映射。
  • 你的Record有虚拟财产吗?
  • 我就是有这个问题。我有其他与可查询扩展(项目到)一起使用的地图,但创建的另一个地图继续说没有映射,即使 MapperConfiguration 清楚地为这两种类型创建了一个地图。所有在同一台机器上运行的同一个项目中。请帮忙!
  • 哇,我不知道 mapperConfig.CreateMapper() 正在创建唯一具有映射的实例!我必须使用注入来获取该映射器,我不能简单地使用 Automapper.Mapper.Map...

标签: c# dependency-injection asp.net-mvc-5 ninject automapper


【解决方案1】:

您还需要添加反向映射。您可以通过以下两种方式之一进行操作:

Mapper.CreateMap<AddRecordViewModel, Record>();
Mapper.CreateMap<Record, AddRecordViewModel>();

或者像这样一气呵成:

Mapper.CreateMap<AddRecordViewModel, Record>().ReverseMap();

如果你问我,后者更可取。

【讨论】:

  • 感谢您的回答。我不知道你可以添加 ReverseMap。这使事情变得更清洁。不幸的是,这不是问题。我仍然收到相同的错误消息。我认为程序以某种方式找不到映射。如果映射存在,我可以在运行时以某种方式检查吗?
  • 那很奇怪。你能把你的两个班级贴出来让我看到班级成员吗?
  • 我认为这与班级成员无关。当我将 Mapper.CreateMap 方法直接添加到控制器方法时,它工作正常(请参阅主帖中的附加信息)。只有当我删除它并想通过 Global.asax 使用映射时,它才不起作用。
  • 奇怪。一切似乎都配置正确。将视图模型映射到记录模型时发生错误。当您的 AutoMapper 配置留在 Application_Start 中时,从 Record 模型到视图模型的映射是否有效?
【解决方案2】:

不要在您的个人资料中调用 Mapper.CreateMap。调用 base.CreateMap,你就设置好了:

public class RecordProfile : Profile
{
    protected override void Configure()
    {
        base.CreateMap<AddRecordViewModel, Record>().ReverseMap();
    }
}

【讨论】:

  • 你能解释一下吗?
  • 如何为列表添加从源到扁平类的映射?
  • 或者直接调用 CreateMap,base 是隐式的,因为 CreateMap 是在 Profile 中定义的。
【解决方案3】:

Mapper.Initialize() 应在每个解决方案中严格使用一次

如果您稍后在某个地方调用Initialize(),它将覆盖您之前的所有映射。 仔细检查你的代码,猜猜,你会在另一个地方找到这个方法的调用。

P.S.:这不是 Automapper 早期的初始行为,正如我在 3 年或更长时间前在 GitHub 上创建的代码片段中看到的那样。

【讨论】:

    【解决方案4】:

    我有类似的问题,我忘记在 Global.asax 中注册

    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
    
    
            AutoMapperConfig.RegisterMappings();
    
        }
    }
    

    【讨论】:

    • 实际上我正在通过测试项目,它没有得到我在 AutoMapperConfig 中完成的映射。谢谢 现在它正在工作
    【解决方案5】:

    在我的情况下,问题是一些默认的 Automapper 映射已向 IoC 注册。

    builder.Register(_ => AutomapperConfiguration.Configure()).As<IMapper>().SingleInstance();
    

    失败的映射注册在不同的地方,服务配置

    static void Main(string[] args)
    {
        var container = ConfigureDependencies();
        AutoMapping.Configure();
    

    该项目收到此错误是一个未执行服务配置的测试项目。调试时会产生错误映射已注册的错觉,这可以从 IoC 映射中看到。

    解决方案,确保所有映射都已在测试解决方案中注册。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 2019-03-01
      • 2017-04-16
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多