• abp(net core)+easyui+efcore实现仓储管理系统——ABP升级7.3下(五十九)


    Abp(net core)+easyui+efcore实现仓储管理系统目录

     

          承接上文abp(net core)+easyui+efcore实现仓储管理系统——ABP升级7.3上(五十八)  继续来讲讲升级过程中碰到的问题。

    第四个问题

            升级过程中碰到的第四个问题:Value cannot be null. (Parameter 'unitOfWork')

            在Visual Studio 2022 的解决方案资源管理器中,找到ABP.TPLMS.Application项目中的Modules文件夹中的ModuleAppService.cs文件,是这个文件中的GetAll()方法报了这个错误。错误信息如下图。具体代码如下。   

    复制代码
       public List GetAll()
            {
    
                var modules= _moduleRepository.GetAllListAsync();
                 return modules.Result;
        }
    复制代码

              在“用户未处理的异常”信息弹出框中,使用鼠标左键点击“查看详细信息”,会弹出“快速监视”弹出框,如下图。我们看到具体的错误信息是Value cannot be null. (Parameter 'unitOfWork')

     

     

             经过一番的资料搜集,最后在官网的文档(https://aspnetboilerplate.com/Pages/Documents/Unit-Of-Work#non-transactional-unit-of-work)中找到以下这段,说明了这个错误。解决方案也在文档中。

              By its nature, a unit of work is transactional. ASP.NET Boilerplate starts, commits or rolls back an explicit database-level transaction. In some special cases, the transaction may cause problems since it may lock some rows or tables in the database. In these situations, you may want to disable the database-level transaction. The UnitOfWork attribute can get a boolean value in its constructor to work as non-transactional. Example usage:

     

     

     

              在Visual Studio 2022 的解决方案资源管理器中,找到ABP.TPLMS.Application项目中的Modules文件夹中的ModuleAppService.cs文件,是这个文件中的GetAll()上方添加禁用UnitOfWork事务的特性。具体代码如下: 

    复制代码
    [UnitOfWork(isTransactional:false)]
            public List GetAll()
            {
    
                var modules = _moduleRepository.GetAllListAsync();
                return modules.Result;
            }
    复制代码

    第五个问题

              升级过程中碰到的第五个问题:Can't create component 'ABP.TPLMS.Modules.ModuleAppService' as it has dependencies to be satisfied.Service 'AutoMapper.IMapper' which was not registered.

           在Visual Studio 2022 的解决方案资源管理器中,按F5运行,Visual Studio 2022又抛出一个新的错误。这个问题实际上是之前的第三个问题的后续,由于第三个问题没有解决好,才引发了这个问题。错误信息如下图。

     

    复制代码
    public class ModuleAppService : ApplicationService, IModuleAppService
        {
    
            private readonly IRepository _moduleRepository;
            AutoMapper.IMapper m_map; 
    
            public ModuleAppService(IRepository moduleRepository, IMapper map)
    
            {
                _moduleRepository = moduleRepository;
                m_map = map;
            }
    }
    
    复制代码

              在“用户未处理的异常”信息弹出框中,使用鼠标左键点击“查看详细信息”,会弹出“快速监视”弹出框,如下图。我们看到具体的错误信息是:

     

           具体的错误信息如下:

          Can't create component 'ABP.TPLMS.Modules.ModuleAppService' as it has dependencies to be satisfied.
     'ABP.TPLMS.Modules.ModuleAppService' is waiting for the following dependencies:
    - Service 'AutoMapper.IMapper' which was not registered.

            这个错误,说明我们的注入方式错误,AutoMapper没有注册,但是我们这是ABP,不是单独使用AutoMapper,需要单独注册,有人会去从nuget上安装automapper包,然后进行注册。我认为,应该有一种方式能解决这个问题。我找到的方法是使用ObjectMapper.Map方法,具体代码如下。

    复制代码
    using Abp.Application.Services;
    using Abp.Application.Services.Dto;
    using Abp.Domain.Repositories;
    using Abp.Domain.Uow;
    using ABP.TPLMS.Entitys;
    using ABP.TPLMS.Modules.Dto;
    using AutoMapper;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data.Common;
    using System.Reflection.PortableExecutable;
    using System.Text;
    using System.Threading.Tasks;
     
     
    namespace ABP.TPLMS.Modules
    {
        public class ModuleAppService : ApplicationService, IModuleAppService
        {
            private readonly IRepository _moduleRepository;
          // AutoMapper.IMapper m_map;
     
            public ModuleAppService(IRepository moduleRepository)
            {
                _moduleRepository = moduleRepository;       
               // m_map =map;
            }
            public Task CreateAsync(CreateUpdateModuleDto input)
            {
               var module= ObjectMapper.Map(input);
               // var module = Mapper.Map(input);
     
                return _moduleRepository.InsertAsync(module);
            }
            public Task UpdateAsync(CreateUpdateModuleDto input)
            {
                Logger.Info("更新操作-日记记录 - 模块类型的名称 为:" + input.DisplayName);
                var module = ObjectMapper.Map(input);
               // var module = m_map.Map(input);
                return _moduleRepository.UpdateAsync(module);
            }
            public async Task> GetAllAsync()
            {
                var modules = await _moduleRepository.GetAllListAsync();
                return new ListResultDto(ObjectMapper.Map>(modules));
               
            }
    
            [UnitOfWork(isTransactional:false)]
            public List GetAll()
            {
                var modules = _moduleRepository.GetAllListAsync();
               return modules.Result;
    
            }
    
            public async Task DeleteAsync(int Id)
            {
                 await _moduleRepository.DeleteAsync(Id);
             }
    
            public  void Delete(int Id)
            {
                 _moduleRepository.Delete(Id);
            }
    
        }
    }
    复制代码

     

           在修改完了代码之后,在Visual Studio 2022中按F5运行,终于看到了登录界面,在登录界面中的用户名中输入admin,在密码输入框中输入123qwe这个默认密码。浏览器自动跳转到了首页面。如下图。

     

     

     

     

    第六个问题:

            升级过程中碰到的第六个问题:Missing type map configuration or unsupported mapping.

           在浏览器的左边的菜单栏中有一个Business菜单,使用鼠标左键点击,展开。在展开的菜单栏,使用鼠标左键点击“模块管理”,Visual Studio 2022将会弹出一个错误。如下图。

     

            在“用户未处理的异常”信息弹出框中,使用鼠标左键点击“查看详细信息”,会弹出“快速监视”弹出框,如下图。我们看到具体的错误信息是:

    Missing type map configuration or unsupported mapping.
          Mapping types:
          Object -> CreateUpdateModuleDto
           System.Object -> ABP.TPLMS.Modules.Dto.CreateUpdateModuleDto

     

           这个错误是由于我们没有定义autoMapper需要的配置信息。

     

      1. 在Visual Studio 2022的“解决方案资源管理器”中,左键单击“ABP.TPLMS.Application”项目,进行展开,找到“Modules\Dto”文件夹。

       2.右键单击“Dto”文件夹,然后选择“添加” > “类”。 将类命名为 ModuleMapProfile,然后选择“添加”。代码如下。

    复制代码
    using ABP.TPLMS.Authorization.Users;
    using ABP.TPLMS.Entitys;
    using ABP.TPLMS.Users.Dto;
    using AutoMapper;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    
    namespace ABP.TPLMS.Modules.Dto
    {
        public class ModuleMapProfile:Profile
        {
            public ModuleMapProfile()
            {
    
                CreateMap();           
                CreateMap();
               CreateMap();
            }
        }
    }
    复制代码

           3.在添加完ModuleMapProfile类的代码之后,在Visual Studio 2022中按F5运行,在登录界面中的用户名中输入admin,在密码输入框中输入123qwe这个默认密码。浏览器自动跳转到了首页面。

           4.在浏览器的左边的菜单栏中有一个Business菜单,使用鼠标左键点击,展开。在展开的菜单栏,使用鼠标左键点击“模块管理”,然后我们看到了模块管理的页面,如下图。

     

          至此项目中的一些问题解决了,ABP.TPLMS能初步运行了,项目也初步升级到了ABP 7.3,不过,这只是第一步,在后续测试中,应该还会有一些问题。

     

  • 相关阅读:
    组合数学(下):概率、博弈
    KNN(上):数据分析 | 数据挖掘 | 十大算法之一
    Docker启动失败:Failed at step LIMITS spawning /sbin/modprobe
    PHP服务器端API原理及示例讲解(接口开发)
    双11狂欢最后一天
    计算机组成原理(二)
    物联网技术助力智慧城市转型升级:智能、高效、可持续
    java计算机毕业设计软考刷题系统源码+mysql数据库+系统+lw文档+部署
    【运维自动化-配置平台】如何使用云资源同步功能(腾讯云为例)
    10.22 校招 实习 内推 面经
  • 原文地址:https://www.cnblogs.com/chillsrc/p/17279290.html