abp vnext pro 使用笔记

官网:https://doc.cncore.club/

abp从源码迁移数据库的命令

1、注意要在EntityFrameworkCore工程里配置TAHMDbContext.cs文件(还有他的接口文件一起配),给需要建表的类增加dbset配置,然后还要注意DbContextModelCreatingExtensions.cs文件中有没有你新增的表的建表脚本。

2、然后打开程序包管理器控制台,cd 命令到EFcore目录 。例如:PM> cd F:\code\SoftwareSystem\TAHM\aspnet-core\services\src\JQ.TAHM.EntityFrameworkCore

3、如果要全部生成数据表则删除Migrations文件夹,输入

dotnet ef migrations add init

然后程序包控制台cd命令到DbMigrator工程目录下(或者到目录下直接打开powershell),如:cd  F:\code\SoftwareSystem\TAHM\aspnet-core\services\src\JQ.TAHM.DbMigrator

运行如下命令,执行迁移前注意项目的数据库连接配置是否正确。

dotnet run

4、如果只是一部分新增的话,cd 命令到EFcore目录,就按新增表聚合跟业务来取名输入

dotnet ef migrations add tahmmenu_init  生成建表脚本,再输入命令

dotnet ef database update  ,执行完毕后去查看数据库有没有增加表就行了。



图形界面用datav-vue3
查vben的组件属性,最好是多关注antd的最新版本5.1.4,地址如下 https://ant.design/。vben官网指向的那个antd2.2.8的地址,很多坑。然后vben的很多属性可能不是在页面里设置,可能是全局属性,比如allowClear,他就是一个全局设置属性,但是在vben里压根没写到,然后vben官网指向的antd2.2.8里他又是allow-Clear。而且实际源代码 他根本不是在vue代码里去对单个标签做allowClear设置,他又是一个FormItem.vue组件的一个开关设置。
默认存储位置 C:\Users\Administrator\.nuget\packages
修改办法:
C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config
加上
<config> 
 <add key="globalPackagesFolder" value="F:\NuGet\packages" />
 </config>

1、前端使用nswag 生成代理,nswag 目录下有nswag.json文件,文件中有个url地址指向的是后端的swagger生成的json,如果后端改动了[]中暴露的接口名,最好是后端清理编译的缓存,重新编译启动,前段也退出重新执行 npm run nswag ,其实后端控制器那里做了任何改动都要在前端更新nswag。
2、src\layouts\default\header\index.vue 这个前端文件可以关闭signalR
const { startConnect } = useSignalR();
   onMounted(() => {
    //startConnect();
   });
3、BasicManagementHttpApiHostModule 文件
options.SendExceptionsDetailsToClients = false; 向客户端发送详细异常的开关
4、如果创建了种子数据的代码,创建租户的时候会频繁调用种子数据代码执行,所以业务数据表尽量不要创建种子数据。
5、推测后端框架代码可能在缓存里产生了很多数据,所以如果修改了代码,想要产生新的版本,最好是清理干净解决方案,然后等待一段时间再重新启动服务,这样缓存可以消失干净。
最暴力的就是执行刚刚那个Delete-BIN-OBJ-Folders.bat文件
或者执行 dotnet build --no-cache
清理解决方案的bin目录之后最好先执行生成解决方案,然后在去启动。
6、前端菜单设置 在 router/routes/modules下面,复制一个路由ts文件替换里面的中英文名字就好了。注意在后端没有建立permission权限代码之前,policy先要注释了。注意path和name属性最好跟后端TAHMPermissions文件中建立的每个模块的静态类名称保持一致。
比如:别后端类里用的SetInfo名称,但是前段path和name里又用的tahmSetInfo,这样肯定出不来菜单和权限。
前端菜单文件代码里 title: t('routes.SetInfo.CollectManagement') 指向的前端多语言文件里的映射。 policy指向的是后端TAHMPermissions文件建立的权限类。

7、JQ.TAHM.Application.Contracts下的permissions目录TAHMPermissions类下可以新建单模块权限,TAHMPermissionDefinitionProvider.cs可以添加权限定义。JQ.TAHM.Application项目下AppService对应的增删改,可以对方法添加权限验证。
8、语言设置,前端src/locals下
9、要为控件或者组件增加属性,查看属性说明, 比如表单FormSchema的属性,可以查看前端框架doc.vvben.cn的官网或者ant design vue官网2x.antdv.com
10、redis模糊删除 
using (var multiplexer = await ConnectionMultiplexer.ConnectAsync(ConnectionString))
      {
        var server = multiplexer.GetServer(HostAndProt);
        var keys = server.Keys(pattern: "*").ToList();
        var db = multiplexer.GetDatabase(DefaultDatabase);
        foreach (var key in keys.Where(key => db.KeyExists(key)))
        {
          await db.KeyDeleteAsync(key);
        }
      }
11、前端代码修改一定要注意如果看不到效果就要重新编译,有时候热编译是没效果的,不如权限的policy
12、Object reference not set to an instance of an object 这种报错提示,如果是出现在接口注入的对象使用时,那可能是这个接口注入的对象没有在类的构造函数中实例化。 如果是出现在使用mapper的方法中,那可能是mapper在appserivce 或者是domain层的mapperprofile中没有对实体做mapper转换。
13、前端使用接口数据字段的时候,一定要注意接口生成的数据的大小写,最好是看接口返回的json数据去复制。 前端使用字段如果没注意大小写,很容易显示不出来数据。
14、前端代码对status状态的类型一定要遵循后端实体的类型,如果后端实体对状态字段定义为bool 前端就不能用0和1,用了会造成后端接口验证数据类型就失败报错,连后端的控制器都进不了。具体报错为:The JSON value could not be converted to System.Boolean. Path: $.send_status
15、代码生成器生成的前端代码 修改的vue文件里,submit函数可能需要加一个 await validate();
16、使用的任何标签都要引入和定义,比如vue文件中使用Tag标签,用了就要引入import { Tag } from "ant-design-vue"; 
并且要在export default defineComponent 中定义 Tag,输出

17、我有一个需求,假设我系统已经上线了,并且创建了租户。按照系统现有逻辑,用主账户再新创建的字典类型设置就无法同步到已经存在的租户了,所以需要实现在主账户可以同步自己新增的或者指定的字典类型给所有租户。实现方法是在字典服务里,新建字典类型时发布一个要求同步字典类型的事件;另外对于已经存在的字典类型也需要同步的,增加一个同步按钮,按钮同样是发布一个要求同步字典类型的事件;主业务服务,或者租户服务订阅字典同步事件,被动同步数据。
18、关于跨服务调用时,被调用服务在做实体映射时发生了 Missing type map configuration or unsupported mapping 异常的解决办法。 我在主业务服务的application层里,调用了字典业务服务的application层工程JQ.TAHM.DataDictionaryManagement.Application来根据ID获取字典类型实体和他的子字典实体列表,在他的domain层的manager类里面将实体映射到dto时报开头这个错误。最终我通过在当前主业务的application层的TAHMApplicationAutoMapperProfile.cs类里面注册实体映射代码行解决了domain层由实体映射到dto的问题,然后字典的application将DTO映射到output实体时也报开头的错误,不过output可能字段数量跟dto不匹配,而且我不需要output,就干脆偷懒直接让字典服务的application方法返回dto给我使用了。

19、System.IO.IOException:“Failed to bind to address http://localhost:44315.”
SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试。 项目偶尔会出现类似这样的端口权限套接字错误。这是端口被占用了,最好的解决办法是释放端口,重启最干脆。

20、我为abpnext项目加了一个新表的业务代码。 然后执行了 dotnet ef database update

结果返回错误提示 Duplicate column name 'ExtraProp',翻译过来就是字段重复。如下图所示

然后我打开新增加的init代码初始化文件,发现他居然只有ExtraProp这一个字段的初始化代码,而这个还偏偏不是我需要修改的字段,只能强行注释 up 方法和down方法里关于ExtraProp字段的代码。然后编译JQ.TAHM.EntityFrameworkCore工程, 再次执行 dotnet ef database update。这次没有报错了。

21、禁止租户参数的  数据过滤,重点看using (_dataFilter.Disable<IMultiTenant>()) 这一句,_dataFilter的生命写到类顶部 private readonly IDataFilter _dataFilter;。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;

namespace Acme.BookStore
{
    public class MyBookService : ITransientDependency
    {
        private readonly IDataFilter _dataFilter;
        private readonly IRepository<Book, Guid> _bookRepository;

        public MyBookService(
            IDataFilter dataFilter,
            IRepository<Book, Guid> bookRepository)
        {
            _dataFilter = dataFilter;
            _bookRepository = bookRepository;
        }

        public async Task<List<Book>> GetAllBooksIncludingDeletedAsync()
        {
            //Temporary disable the ISoftDelete filter
            using (_dataFilter.Disable<IMultiTenant>())
            {
                return await _bookRepository.GetListAsync();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值