ABP使用PostgreSql数据库

341次阅读
没有评论

参考文章

Net7 EF Core 使用Postgresql插入数据时间戳错误 – 知乎 (zhihu.com)

最近因为客户终于愿意把服务器环境整体迁移到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解决方案 中也要添加,因为迁移的时候是从这个项目启动的。

老三的古代
版权声明:本站原创文章,由 老三的古代2024-04-09发表,共计1489字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)