自动映射器不在两个对象之间进行映射(对于所有意图和目的而言几乎相同)

时间:2017-12-14 12:46:43

标签: asp.net-core automapper

是的,这是另一个" Automapper not mapping"题。无论是破碎的东西还是我愚蠢的方式。我正在使用AutoMapper 3.2.0(当时最新的稳定版本)使用ASP.NET Core 2.1构建一个webapp,尽管我已经使用3.1.0进行了测试但没有运气。

问题

要映射到另一个的简单对象。为了测试和试验,这些现在完全相同,但仍然是自动化器:

AutoMapperMappingException:缺少类型映射配置或不支持的映射。

映射类型: NotificationModel - > NotificationViewModel ProjectName.Models.Dashboard.NotificationModel - > ProjectName.Models.Dashboard.NotificationViewModel

奇怪的是,我之前已经在Startup.cs文件中将这个模型设置为星期日的7种方式,唯一改变的是我的面部表情。其他地图使用类似的(如果不是相同的代码)来表示。

模特

NotificationModel.cs

public class NotificationModel
    {
        public int Id { get; set; }
        public string Content { get; set; }
        public DateTime CreateTS { get; set; }
        public bool FlagRead { get; set; }
        public bool FlagSticky { get; set; }
        public bool FlagReceipt { get; set; }
        public string ReceiptContact { get; set; }
        public string UserId { get; set; }
        public bool CANCELLED { get; set; }
    }

NotificationViewModel.cs

public class NotificationViewModel
{
    public int Id { get; set; }
    //Reminder, this model has been amended to exactly represent that of the original model for testing purposes.
    public string Content { get; set; }
    public DateTime CreateTS { get; set; }
    public bool FlagRead { get; set; }
    public bool FlagSticky { get; set; }
    public bool FlagReceipt { get; set; }
    public string ReceiptContact { get; set; }
    public string UserId { get; set; }
    public bool CANCELLED { get; set; }        
}

启动& Automapper配置

    Mapper.Initialize(cfg =>
            {
// Some other mappings removed for clarity.
                cfg.CreateMap<GroupViewModel, GroupModel>().ReverseMap();
                //cfg.CreateMap<EntityViewModel, EntityModel>().ReverseMap().ForAllOtherMembers(opt => opt.Ignore());


                cfg.CreateMap<NotificationModel, NotificationViewModel>().ForAllMembers(opt => opt.Ignore());
                cfg.CreateMap(typeof(NotificationViewModel), typeof(NotificationModel));
//I even left out the .ReverseMap, for testing purposes.
            });
            Mapper.AssertConfigurationIsValid();

用法

NotificationViewModel test = _mapper.Map<NotificationViewModel>(item); << Which是我收到例外的地方。

其他尝试

好的,所以我已经通过一些解释不同内容的文章,然后分别尝试了以下内容:

cfg.CreateMap(typeof(NotificationModel), typeof(NotificationViewModel));
cfg.CreateMap<NotificationModel, NotificationViewModel>().ReverseMap().ForAllMembers(opt => opt.Ignore());
cfg.CreateMap<NotificationModel, NotificationViewModel>().ForAllOtherMembers(opt => opt.Ignore());

同时:

NotificationViewModel test = _mapper.Map<NotificationViewModel>(item);
_mapper.Map(item, typeof(NotificationViewModel), typeof(NotificationModel));
NotificationViewModel existingDestinationObject = new NotificationViewModel();
                _mapper.Map<NotificationModel, NotificationViewModel>(item, existingDestinationObject);

我试过修改.Map()/。Map&lt;&gt;使用了几种方式,除了未配置的例外之外,其中任何一种方式都没有产生任何效果。

没有为这个对象手动编写转换(这对于它的目的来说足够简单),我迫切需要一个解决方案。如果不使用,那么至少要学习并帮助面对同样的人。

更新

IT工作!

通过项目扫描,我注意到之前文档中的某处 - 我读过有关创建一种&#34; config&#34;刚刚从名为Profile的抽象类继承的类。在这个类中,您还可以定义您的地图,但奇怪的是,我无法删除此类,只需在我的Startup.cs文件中使用配置映射设置。 Automapper将拒绝保留此单独类中未定义的任何映射。下面似乎得到了我需要的东西,但是我仍然需要解释为什么Automapper在没有它的情况下不能正常运行:

public class AMConfig : Profile
{
    public AMConfig()
    {
        CreateMap<ManageUserModel, IndexViewModel>();
        CreateMap<IndexViewModel, ManageUserModel>();
        CreateMap<NotificationViewModel, NotificationModel>().ReverseMap();
        CreateMap<List<NotificationViewModel>, List<NotificationModel>>().ReverseMap();
        CreateMap<TaskViewModel, TaskModel>().ReverseMap();
    }
}

谢谢!

1 个答案:

答案 0 :(得分:0)

通过项目扫描,我注意到之前文档中的某处 - 我读过有关创建一种&#34; config&#34;刚刚从名为Profile的抽象类继承的类。在这个类中,您还可以定义您的地图,但奇怪的是,我无法删除此类,只需在我的Startup.cs文件中使用配置映射设置。 Automapper将拒绝保留此单独类中未定义的任何映射。下面似乎得到了我需要的东西,但是我仍然需要解释为什么Automapper在没有它的情况下不能正常运行:

public class AMConfig : Profile
{
    public AMConfig()
    {
        CreateMap<ManageUserModel, IndexViewModel>();
        CreateMap<IndexViewModel, ManageUserModel>();
        CreateMap<NotificationViewModel, NotificationModel>().ReverseMap();
        CreateMap<List<NotificationViewModel>, List<NotificationModel>>().ReverseMap();
        CreateMap<TaskViewModel, TaskModel>().ReverseMap();
    }
}