【问题标题】:Automapper error after updating a record with POCO classes, Unity and EF6使用 POCO 类、Unity 和 EF6 更新记录后的 Automapper 错误
【发布时间】:2018-12-13 12:06:03
【问题描述】:

我创建了一个使用自动映射器的应用程序,一切似乎都已配置并在浏览模式下正常工作,但是在我更新记录后,我收到以下映射错误:

  AutoMapper.AutoMapperMappingException was unhandled by user code
  HResult=-2146233088
  Message=Missing type map configuration or unsupported mapping.
  Mapping types:
  Organisation -> ViewModelOrganisation

我已经在应用程序启动中注册了自动映射器:

protected void Application_Start()
    {
        App_Start.AutoMapperConfig.Initialize();
    }

然后在 Automapperconfig 中完成映射:

public class AutoMapperConfig
{

    public static void Initialize()
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<Organisation, ViewModelOrganisation>().ReverseMap();
            cfg.CreateMap<Article, ViewModelArticle>().ReverseMap();
            cfg.CreateMap<Organisation, ViewModelAdminOrg>().ReverseMap();
            cfg.CreateMap<Branch, ViewModelBranch>().ReverseMap();
        });

    }

}

当应用程序启动并且我可以浏览该站点时,这会点击确定。当我保存记录(更新)时会出现问题。信息会保存,但是当我返回另一个页面浏览该站点时,我会遇到映射错误。

更新:

我像这样在控制器中映射:

public ActionResult Detail(int id)
    {
        Organisation org = new Organisation();
        ViewModelOrganisation vm = new ViewModelOrganisation();
        org = _orgService.getOrganisationByOrgID(id);
        vm = Mapper.Map(org, vm);
        return View(vm);
    }

错误发生在一行:vm = Mapper.Map(org, vm)。它也出现在使用映射器的其他页面上。但只有在我更新了管理面板中的记录之后。

【问题讨论】:

  • 这不是完整的错误信息。请发布完整的例外。可能您缺少从源类型到目标类型的映射,必须将其添加到您的初始化方法中。初始化时也不会抛出这个错误,它会在 AutoMapper 尝试从 type a 转换为 type b 时抛出。
  • 如果您不知道此异常发生的位置,请在 Visual Studio 中启动您的应用程序。在 Visual Studio Debug - Window - Exception Settings 中打开并启用第二个选项 Common Language Runtime Exception 的复选框。然后您的调试器将在引发此异常的位置停止。
  • @Oliver 错误在 vm = Mapper.Map(org, vm);在控制器中,但是我认为这不是问题,因为它仅在使用实体框架进行更新后才停止工作?

标签: c# asp.net-mvc automapper poco


【解决方案1】:

正如您的完整异常消息所述,映射器没有从 OrganisationViewModelOrganisation 的映射。我不确定,但是在反向映射旁边是否也不需要正常映射?所以尝试添加cfg.CreateMap&lt;Organisation, ViewModelOrganisation&gt;()

您还可以将代码简化为:

public ActionResult Detail(int id)
{
    var org = _orgService.getOrganisationByOrgID(id);
    var vm = Mapper.Map<ViewModelOrganisation>(org);
    return View(vm);
}

【讨论】:

  • 使用反向映射意味着我可以使用 Mapper.Map(article, vm) 行,反之亦然 Mapper.Map(vm, article)。编辑记录时很有用。
【解决方案2】:

在 global.asa 中初始化映射器之前,我在控制器本身中执行此操作。我未能从控制器中删除正在编辑文章记录的行(下):

 Mapper.Initialize(cfg => cfg.CreateMap<Article, ViewModelArticle>());

这一定使启动时创建的映射无效,因此当我浏览网站的其余部分时出现错误。

经验教训...确保只初始化映射器一次!

【讨论】:

  • 在我的 asp.net 核心项目中,我使用的是 Microsoft DI 框架。所以在我的 Startup.cs 中,我打电话给services.AddAutoMapper()。由于这个事实,我可以将每个构造函数类中的映射器注入为MyClass(IMapper mapper)。要使用所需配置初始化此映射器,我需要创建派生自 AutomMapper.Profile 的(单个)类。在上述AddAutoMapper() 方法中,它将扫描整个AppDomain 以查找从Profile 派生的所有类,并用它初始化映射器。这让这些事情变得容易多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多