EFCore sql 中双引号相关问题

1:PL/SQL  中 单、双引号作用

    单引号:单引号是字符串分隔符,用于定义字符串字面值

    双引号:双引号是引用标识符分隔符,可用它来访问从数据库目录以区分大小写的方式创建的表,如果你是以区分大小写的方式创建数据库表,这个是必需的。双引号还能引注引住关键字。

2:EF core 中 SQL 带有双引号处理方式

 遇到的问题抓日志得到执行报错:

2020-03-17 21:35:33,618 [9 ERROR]  ---- Failed executing DbCommand (414ms) [Parameters=[], CommandType='Text', CommandTimeout='0']
SELECT "s"."Pid", "s"."Abbr", "s"."Address", "s"."Batteries_In_Stock", "s"."Charger_Count", "s"."City", "s"."Close_Time", "s"."Company_Pid", "s"."District_Code", "s"."Gmt_Create", "s"."Gmt_Modified", "s"."Latitude", "s"."Longitude", "s"."Manager", "s"."Name", "s"."Open_Time", "s"."Province", "s"."Remark", "s"."Station_No", "s"."Status", "s"."Tel", "s"."User_Create", "s"."User_Modified"
FROM "charging_station" "s"
WHERE "s"."Station_No" = N'48'Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-00942: 表或视图不存在

  其实这个问题还是双引号在搞怪,当你去掉引号在PL/SQL里面执行时,什么问题都没有。加上后PL/SQL 就报相同的异常

ORA-00942: 表或视图不存在。

解决方案如下(可供参考,希望有其他更好的办法来解决这个问题,毕竟性能有损失)

首先表名和字段中有下划线_ 和 表名和列名转大写处理方式


        public static string ToSnakeCase(this string input)
        {
            if (string.IsNullOrEmpty(input)) { return input; }

            var startUnderscores = Regex.Match(input, @"^_+");
            return startUnderscores + Regex.Replace(input, @"([a-z0-9])([A-Z])", "$1_$2").ToUpper();
        }

然后在DBContext 的子类中重写 OnModelCreating 的方法时重新赋值表名和列名(视图、索引等都可以这样处理)


    public class OracleDBContext : Microsoft.EntityFrameworkCore.DbContext
    {
        public OracleDBContext(DbContextOptions<OracleDBContext> options) : base(options)
        {
        }  
        .....业务表DbSet

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            ...业务表 modelBuilder.Entity

            foreach (var entity in modelBuilder.Model.GetEntityTypes())
            {
                // 重置所有表名
                var snakecase = entity.Relational().TableName.ToSnakeCase();
                entity.Relational().TableName = snakecase;
                // 重置所有列名
                foreach (var property in entity.GetProperties())
                {
                    property.Relational().ColumnName = property.Relational().ColumnName.ToSnakeCase();
                }
            }
        }

    } 
发布了12 篇原创文章 · 获赞 0 · 访问量 651

猜你喜欢

转载自blog.csdn.net/oopxiajun2011/article/details/104932499