参考文章
最近因为客户终于愿意把服务器环境整体迁移到linux了,终于可以使用docker了,于是乎就有了今天的迁移方案。原本的环境是windows+sqlserver,客户的环境是linux(国产)+达梦(之前有经验,迁移不太顺话),迁移之前我想先改自己的环境,于是就把数据库从mysql换成了Postgresql。
安装库
Volo.Abp.EntityFrameworkCore.PostgreSql
在EntityFrameworkCore
解决方案中的项目依赖 Volo.Abp.EntityFrameworkCore.SqlServer 替换为 Volo.Abp.EntityFrameworkCore.PostgreSql,三个地方需要改,
EntityFrameworkCoreModule 中替换 DependsOn; 在ConfigureServices中修改AbpDbContextOptions的数据库配置; DCMDbContextFactory中将链接处改为pg;
至此驱动切换代码部分已经改完了,开始进行迁移。
- 删除模板项目里
EntityFrameworkCore
解决方案中的Migrations,这是因为里面的迁移代码是根据你模板选择的数据库生成的迁移对现在的数据不适用。 - 删除后打开
程序包管理控制器
,设置默认项目为EntityFrameworkCore
,输入代码add-migration "init"
- 右键 DbMigrator解决方案启动调试,即可进行迁移。
快速启动pg,下面是docker-compose
version: '3.9' services: db: image: postgres:16.2 restart: always # set shared memory limit when using docker-compose shm_size: 128mb # or set shared memory limit when deploy via swarm stack #volumes: # - type: tmpfs # target: /dev/shm # tmpfs: # size: 134217728 # 128*2^20 bytes = 128Mb environment: POSTGRES_PASSWORD: '!Xiaowanghu521' ports: - 5432:5432 adminer: image: adminer restart: always ports: - 9080:8080
迁移过程中可能会出现下面这个问题,
Cannot write DateTime with Kind=Local to PostgreSQL type 'timestamp with time zone', only UTC is supported. Note that it's not possible to mix DateTimes with different Kinds in an array, range, or multirange. Arg_ParamName_Name
单看信息基本可以看出来问题在哪,但是不知如何解决,百度一下解决了,在启动处添加如下代码,
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
这里记得在 DbMigrator解决方案 中也要添加,因为迁移的时候是从这个项目启动的。