首页 > 数据库 >C#使用PostgreSQL及其衍生产品GaussDB时(Npgsql.EntityFrameworkCore.PostgreSQL)过程中的几个问题

C#使用PostgreSQL及其衍生产品GaussDB时(Npgsql.EntityFrameworkCore.PostgreSQL)过程中的几个问题

时间:2024-07-22 18:09:40浏览次数:9  
标签:Account PostgreSQL Npgsql C# 问题 EntityFrameworkCore 使用 true

  PostgreSQ作为开源免费的数据库,现在正在火热的占据市场,它衍生产品,比如GaussDB在国产化替代中使用比较多,然而它们或多或少存在一个兼容问题,或者说是版本之间的问题,所以这里记录几个在使用过程中碰到的问题,做个笔记,后续有新的问题就再记录。

  问题一0A000: DISCARD statement is not yet supported.

  这个问题是连接池重置导致的一个问题,官网介绍:https://www.npgsql.org/doc/performance.html#pooled-connection-reset

  这个时候,我们可以在连接字符串中添加 No Reset On Close=true配置项,比如:  

    string connectionString = "Host=localhost;Port=5432;Database=postgres;Password=123456;User ID=postgres;No Reset On Close=true;"

 

  问题二使用EFCore执行Linq查询时,因为版本问题报错,特别是在使用GaussDB等衍生产品时,比较常见

  比如我执行一个Linq的查询时:  

    var accounts = new string[] { "zhangsan", "lisi" };
    var users = await context.Set<SysUser>().Where(f => accounts.Contains(f.Account)).ToArrayAsync();

  使用最新的 Npgsql.EntityFrameworkCore.PostgreSQL得到的SQL语句是这样的:

    SELECT s."Id", s."Account", s."Avatar", s."Birthday", s."Email", s."Name", s."NickName", s."Password", s."Phone",
    FROM sys_user AS s
    WHERE s."Account" = ANY (@__accounts_0) OR (((s."Account" IS NULL)) AND ((array_position(@__accounts_0, NULL) IS NOT NULL)))

  然后执行报错:Npgsql.PostgresException (0x80004005): 42883: function array_position(character varying[], unknown) does not exist

  很显然他是说找不到指定的函数(你的可能是其它函数),这就是版本的问题

  解决方法是在添加服务时,使用 UseRedshift方法来处理:  

    string connectionString = "Host=localhost;Port=5432;Database=postgres;Password=123456;User ID=postgres;"
        
    services.AddDbContext<MyDbContext>(options =>
    {
        options.UseNpgsql(connectionString, options =>
        {
            options.UseRedshift(true);
        });
    });

  这其实就是告诉EFCore不要使用那些不支持的属性,然后我这边上面的Linq查询就会被翻译成:  

    SELECT s."Id", s."Account", s."Avatar", s."Birthday", s."Email", s."Name", s."NickName", s."Password", s."Phone",
    FROM sys_user AS s
    WHERE s."Account" IN ('zhangsan', 'lisi')

 

  问题三日期问题(有时区和无时区时间)(  DateTimeOffsetDateTime)

  遇到报错:  

    One or more errors occurred. (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. 
    See the Npgsql.EnableLegacyTimestampBehavior AppContext switch to enable legacy behavior.)

   很明显,这个是在说我们时间使用上的问题,我们数据库对应字段是 timestamp with time zone,它表示的是一个有时区的时间,但是我们类型用的是DateTime,他表示的是一个无时区的时间,所以我们要使用有时间的时间类型 DateTimeOffset,但是我们用习惯了DateTime,如果要改动,代价太大了,怎么办呢,有个兼容的办法,全局添加这两个代码就行了  

    internal class MyDbContext : DbContext
    {
        static MyDbContext()
        {
            AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
            AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
        }

        ...
    }

  

 

标签:Account,PostgreSQL,Npgsql,C#,问题,EntityFrameworkCore,使用,true
From: https://www.cnblogs.com/shanfeng1000/p/18171685

相关文章

  • iHack.dll 文件详解及其缺失的解决方法
    如果您的系统提示缺少ihack.dll,这种情况下,解决方法通常不建议简单地去网上搜索并下载ihack.dll文件,因为这会带来严重的安全风险,可能导致病毒感染、数据泄露或其他安全问题。正确的做法是:1.检查软件合法性确认您正在尝试运行的软件或游戏是合法的,没有被非法修改或包含恶意代......
  • 解决 Atlantic.dll 错误:电脑修复步骤与建议
    atlantic.dll不是一个标准的Windows系统文件,也不是广泛认可的软件组件,因此它的具体用途和来源可能比较难以确定。通常,atlantic.dll可能与特定的软件或游戏相关,尤其是一些较老的或特定地区的软件。这个DLL文件可能包含了用于处理网络通信、数据传输或其他特定功能的代码。当系......
  • 医学实验室检验系统源码 C#语言LIS系统全套源码,多家大型综合医院应用案例,适合二次开发
    实验室管理信息系统LIS源码,采用.NetC#语言开发,C/S架构。支持DB2,Oracle,MSSQLServer等主流数据库。(全套LIS系统源码,自主版权,多家大型综合医院应用案例,适合二次开发,项目应用)LIS系统菜单功能:1、系统维护基础数据维护、项目相关维护、人员权限维护、打印模板维护、微生物维......
  • 《Epic Games》启动显示找不到xinput1_3.dll怎么处理,Epic游戏平台提示缺失xinput1_3.d
    在通过EpicGames平台尽情畅玩各类精彩游戏的过程中,有部分玩家或许会不幸遭遇“找不到xinput1_3.dll”或者“xinput1_3.dll缺失”这样的错误提示。由此导致游戏无法顺利启动。这类问题的根源在于系统中缺少了一个被称作“xinput1_3.dll”的关键重要动态链接库文件,直接对游戏的......
  • org.springframework.beans.factory.BeanCreationException: Error creating bean wit
    场景:springcloud的服务service-order 启动和运行正常application.yml内容server:port:8007servlet:context-path:/service-orderspring:cloud:nacos:discovery:server-addr:192.168.56.30:8848application:name:service-......
  • 使用OpenCV进行ROS 2的循线跟踪
    原文链接:https://www.youtube.com/watch?v=88y_1ovno8g InthisOpenClass,we'llexplorehowtoimplementaline-followingrobotusingOpenCVandROS2.在这堂公开课中,我们将探讨如何使用OpenCV和ROS2来实现一个循线跟踪机器人。 Youwilllearn:✏️ Introducti......
  • 【Kernel】关于Linux内核参数 net.ipv4.ip_local_reserved_ports
    网络端口号是如何分配的?除了给常用服务保留的Well-knownPortnumbers之外,给客户端的端口号通常是动态分配的,称为ephemeralport(临时端口),在Linux系统上临时端口号的取值范围是通过这个内核参数定义的:net.ipv4.ip_local_port_range(/proc/sys/net/ipv4/ip_local_port_range),......
  • 【Remotery】 Remotery-轻量级的远程实时 CPU/GPU 分析器设计浅析
    1.Remotery简介Remotery是一个轻量级的远程实时CPU/GPU分析器,主要用于监控CPU和GPU上多线程的活动。它提供了一个C文件,可以很容易的集成到项目中,并配置一个实时监控的Web界面,可以通过远程观察和分析程序的性能,适用于监控游戏的实时运行性能和分析移动端应用的性能场景。2.Remot......
  • 安防视频监控/视频集中存储EasyCVR视频汇聚平台修改配置后无法启动的原因排查与解决
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等。平台能对外分发RTMP、RT......
  • 在 .NET 下,Fiddler 不再抓取 Web Service 流量问题
    在.NET下,Fiddler不再抓取WebService流量问题问题现象原来的一个应用中,需要访问SOAP服务。在原来的.NETFramework版本中,使用Fiddler是可以抓取到访问这个WebService的SOAP流量的。在迁移到.NET之后,Fiddler就不能再抓取到SOAP流量了。问题分析Fiddler......