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

时间:2014-09-26 15:09:44

标签: c# asp.net-mvc entity-framework asp.net-mvc-5 automapper

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

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

我修复了该错误后,立即收到以下错误消息:enter image description here

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

Global.asax.cs

protected void Application_Start()
{
     ConfigureAutomapper.Configure();
     ....

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>();
        });
    }
}

...

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

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

            Mapper.CreateMap<PagesViewModel, Pages>();
            ...

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

对于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; }

我的 ViewModel:

public PageTypeViewModel PageTypes { get; set; }
public SiteMapViewModel SiteMap { get; set; }
public ICollection<RowsViewModel> Row { get; set; }
public TrackViewModel Tracks { get; set; }

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


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

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

      //Act
      ConfigureAutomapper.ConfigureBasic();

      //Assert
      Mapper.AssertConfigurationIsValid();
 }

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

有人能就这个问题给我一些见解吗?如果您需要更多信息,请与我们联系。谢谢!

2 个答案:

答案 0 :(得分:7)

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

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

        CreateMap<PagesViewModel, Pages>();
     ...

在个人资料中,您需要引用Mapper的{​​{1}}或this.CreateMap的实例。

<强>更新 更新我的答案,以便未来的读者不必通过评论来解决问题。

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

答案 1 :(得分:1)

可能配置错误。

您应该添加以下单元测试

        [Test]
        public void AreMappingsValid()
        {
            ConfigureAutomapper.Configure();
            AutoMapper.Mapper.AssertConfigurationIsValid();
        }