当Map存在时,AutoMapper会抛出缺失的地图

Ter*_*ato 3 c# asp.net-mvc entity-framework automapper asp.net-mvc-5

规格: .NET 4.5.1 - MVC 5.2.2 - EF 6.0 - AutoMapper 3.2.1

我第一次遇到Proxy对象错误但是能够通过执行以下操作来解决它:AutoMapper 3.1.1和Entity Framework 6.1 Proxy对象

一旦我修复了该错误,我立即收到以下错误消息:在此输入图像描述

出于某种原因,它表示从Pages到PagesViewModel的地图不存在,即使它确实存在.这是我的代码:

Global.asax.cs中:

protected void Application_Start()
{
     ConfigureAutomapper.Configure();
     ....
Run Code Online (Sandbox Code Playgroud)

AutoMapper.cs(更新)

public static class ConfigureAutomapper
{
    public static void Configure()
    {
        ConfigurePublications();
        ConfigureBlog();
        ConfigureBasic();
        ConfigureLists();
    }

    public static void ConfigurePublications()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<PublicationsMappings>();
        });
    }

    public static void ConfigureBlog()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<BlogMappings>();
        });
    }

    public static void ConfigureBasic()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<BasicMappings>();
        });
    }

    public static void ConfigureLists()
    {
        Mapper.Initialize(x =>
        {
            x.AddProfile<ListMappings>();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

...

public class BasicMappings : Profile
    {
        public override string ProfileName
        {
            get
            {
                return "BasicMappings";
            }
        }

        protected override void Configure()
        {
            Mapper.CreateMap<Pages, PagesViewModel>();

            Mapper.CreateMap<PagesViewModel, Pages>();
            ...
Run Code Online (Sandbox Code Playgroud)

我已经跟踪它,它进入并创建了地图.当它使用转换时,它不起作用.

对于model和viewModel,所有变量名都是相同的.我只添加了数据注释和一些清理类set { pageDescription = value.StringSanitizer(); }

声明链接对象/表时会出现差异:

模型:

public virtual PageType PageTypes { get; set; }
public virtual SiteMap SiteMap { get; set; }
public virtual ICollection<Rows> Row { get; set; }
public virtual Track Tracks { get; set; }
Run Code Online (Sandbox Code Playgroud)

而我的ViewModel:

public PageTypeViewModel PageTypes { get; set; }
public SiteMapViewModel SiteMap { get; set; }
public ICollection<RowsViewModel> Row { get; set; }
public TrackViewModel Tracks { get; set; }
Run Code Online (Sandbox Code Playgroud)

连接到这些模型的viewModels.所有这些都映射到AutoMapper.cs中


更新: 我已经在项目中进行了单元测试:

[TestMethod]
public void AutoMapper_Basic_Configuration_IsValid()
{
      //Arrange

      //Act
      ConfigureAutomapper.ConfigureBasic();

      //Assert
      Mapper.AssertConfigurationIsValid();
 }
Run Code Online (Sandbox Code Playgroud)

它通过了所有测试,没有映射错误.

谁能给我一些关于这个问题的见解?如果您需要更多信息,请与我们联系.谢谢!

Mrc*_*ief 7

而不是Mapper.CreateMap<Pages, PagesViewModel>();,使用CreateMap<Pages, PagesViewModel>();.

protected override void Configure()
    {
        CreateMap<Pages, PagesViewModel>();

        CreateMap<PagesViewModel, Pages>();
     ...
Run Code Online (Sandbox Code Playgroud)

内部配置文件,您需要参考的实例Mapperthis.CreateMap或干脆CreateMap.

更新 更新我的答案,以便未来的读者不必趟过评论来找出问题.

问题是多次调用Mapper.Initialize.每个新调用都将清除先前的初始化.解决方法是进行一次初始化调用并在其中添加所有配置文件.

  • 让我们[在聊天中继续讨论](http://chat.stackoverflow.com/rooms/62003/discussion-between-mrchief-and-termato). (2认同)