c# - 如何在解决方案中将 Automapper 4.2.1 升级到 6.1.1。我缺少什么?

标签 c# asp.net asp.net-mvc automapper automapper-6

我正在从 nuget 更新我的 automapper 4.2.1,它是安装 automapper 6.1.1 版本。在旧版本中,所有映射都正常工作,但是当我更新我的自动映射器库时,映射不起作用,它说缺少类型映射配置或不支持的映射。使用时的映射类型 Mapper.Map<Class1,Class2>(result) .我正在使用配置文件在 global.asax 中进行配置.我的项目是 C# MVC,这是我的代码;

在 Global.asax 中

 public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
           AutoMapperConfigurations.Configure();
        }
    }

我的映射器配置

public class AutoMapperConfigurations
    {
        public static void Configure()
        {

            Mapper.Initialize(cfg =>
            {
                cfg.AddProfile<ModeltoDTOMappingsProfile>();
                cfg.AddProfile<DTOtoDTOModelMappingsProfile>();
                cfg.AddProfile<DTOtoViewModelMappingsProfile>();
                //cfg.ForAllMaps((tm, me) => me.ForAllMembers(option => option.Condition((source, destination, sourceMember) => sourceMember != null)));
            });


            Mapper.AssertConfigurationIsValid();
   }

这是我的一个配置文件示例代码

public class DTOtoViewModelMappingsProfile: Profile
    {

        public DTOtoViewModelMappingsProfile()
        {

            Mapper.Initialize(cfg =>
            {
                // Also I tried these one but It didn't work

                //cfg.CreateMissingTypeMaps = true;
                //cfg.AllowNullCollections = true;
                //cfg.AllowNullDestinationValues = false;
                //cfg.ForAllMaps((tm, me) => me.ForAllMembers(option => option.Condition((source, destination, sourceMember) => sourceMember != null)));

    #region Category

                cfg.CreateMap<TreeCategoryViewModel, TreeCategoryDtos>()
                    .ForMember(dest => dest.T_C_ID, opt => opt.MapFrom(src => src.CId))
                    .ForMember(dest => dest.T_C_DESC, opt => opt.MapFrom(src => src.CDesc))
                    .ForMember(dest => dest.T_C_INUSE, opt => opt.MapFrom(src => src.CInuse))
                    .ForMember(dest => dest.T_IS_TECH, opt => opt.MapFrom(src => src.IsTech))
                    .ForMember(dest => dest.T_IS_BRANCH, opt => opt.MapFrom(src => src.IsBranch))
                    .ForMember(dest => dest.T_IS_MARKETING, opt => opt.MapFrom(src => src.IsMarketing))
                    .ForMember(dest => dest.T_IS_SUPPORT, opt => opt.MapFrom(src => src.IsSupport))
                    .ForMember(dest => dest.T_C_LEVEL, opt => opt.MapFrom(src => src.CLevel))
                    .ForMember(dest => dest.T_C_ORDER, opt => opt.MapFrom(src => src.COrder))
                    .ForMember(dest => dest.T_C_PARENT, opt => opt.MapFrom(src => src.CParent))
                    .ForMember(dest => dest.TREE_CATEGORY1, opt => opt.ResolveUsing(src => src.TreeCategoryDtos1))
                    .ForMember(dest => dest.TREE_CATEGORY2, opt => opt.ResolveUsing(src => src.TreeCategoryDtos2))
                    ;

                cfg.CreateMap<TreeCategoryDtos, TreeCategoryViewModel>()
                    .ForMember(dest => dest.CId, opt => opt.MapFrom(src => src.T_C_ID))
                    .ForMember(dest => dest.CDesc, opt => opt.MapFrom(src => src.T_C_DESC))
                    .ForMember(dest => dest.CInuse, opt => opt.MapFrom(src => src.T_C_INUSE))
                    .ForMember(dest => dest.IsTech, opt => opt.MapFrom(src => src.T_IS_TECH))
                    .ForMember(dest => dest.IsBranch, opt => opt.MapFrom(src => src.T_IS_BRANCH))
                    .ForMember(dest => dest.IsMarketing, opt => opt.MapFrom(src => src.T_IS_MARKETING))
                    .ForMember(dest => dest.IsSupport, opt => opt.MapFrom(src => src.T_IS_SUPPORT))
                    .ForMember(dest => dest.CLevel, opt => opt.MapFrom(src => src.T_C_LEVEL))
                    .ForMember(dest => dest.COrder, opt => opt.MapFrom(src => src.T_C_ORDER))
                    .ForMember(dest => dest.CParent, opt => opt.MapFrom(src => src.T_C_PARENT))
                    .ForMember(dest => dest.TreeCategoryDtos1, opt => opt.ResolveUsing(src => src.TREE_CATEGORY1))
                    .ForMember(dest => dest.TreeCategoryDtos2, opt => opt.ResolveUsing(src => src.TREE_CATEGORY2))
                    ;

                #endregion

            });

            Mapper.AssertConfigurationIsValid();
        }

在 Controller 中

var result = Mapper.Map<TreeCategoryViewModel,TreeCategoryDtos>(treeCategories);

在这一行中是异常(exception)。为什么我会收到此错误?(缺少类型映射配置或不支持的映射。映射类型:TreeCategoryViewModel -> TreeCategoryDtos Project.Models.ViewModel.TreeCategoryViewModel -> Project.BusinessLayer.CategoriesBL.Dtos.TreeCategoryDtos)


现在错误信息已经改变了。这就是我现在得到的“Mapper 未初始化。使用适当的配置调用 Initialize。如果您尝试通过容器或其他方式使用 Mapper 实例,请确保您没有对静态 Mapper.Map 的任何调用方法,如果您使用的是 ProjectTo 或 UseAsDataSource 扩展方法,请确保传入适当的 IConfigurationProvider 实例。

但是错误来自这个类。在我的模型映射中。

public class ModeltoDTOMappingsProfile : Profile
    {
        public ModeltoDTOMappingsProfile()
        {
                 CreateMap<TREE_CATEGORY, TreeCategoryDtos>();
                 CreateMap<TreeCategoryDtos, TREE_CATEGORY>()
                    .ForMember(dest => dest.G_MARK_FOR_DELETE, opt => opt.Ignore())
                    .ForMember(dest => dest.L_INSERTDATE, opt => opt.Ignore())
                    .ForMember(dest => dest.L_INSERTUSER, opt => opt.Ignore())
                    .ForMember(dest => dest.L_UPDATEDATE, opt => opt.Ignore())
                    .ForMember(dest => dest.L_UPDATEUSER, opt => opt.Ignore());

        }
    }

我正在使用 AutomapperConfigurations 在 global.asax 中调用我的配置文件。你可以在上面看到这些代码

最佳答案

您只能调用 Mapper.Initialize 一次 - 使用此代码,每次加载配置文件时都会覆盖配置。

您的配置文件应继承自 Profile - 参见 the documentation

关于c# - 如何在解决方案中将 Automapper 4.2.1 升级到 6.1.1。我缺少什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44845163/

相关文章:

c# - 如何将 Bitmap 转换为 Base64 字符串?

c# - 将字符串转换为正确的日期

c# - 在 Process Explorer 中调试 RtlUserThreadStart

c# - 在 ASP.NET 中通过 jQuery/ajax 获取复杂对象

c# - 如何使用asp.net从网页中抓取数据

javascript - 如何使用 Ajax 将文档上传到 Web api,而不使用 html 用户控件或表单?

c# - AddRange() 和 LINQ 复制问题

asp.net - 有没有适用于 ASP.NET 的磁盘缓存解决方案?

javascript - javascript getElementsByName 可以访问隐藏元素吗?

asp.net-mvc - 通过以编程方式执行 Controller (使用 RouteData)来捕获 Action 的结果