[EF Core Oracle 列名大小写问题]
[EF Core Oracle column name case problem]
[EF Core PostgreSql 列名大小写问题]
[EF Core PostgreSql column name case problem]
大家好,我是 IKUN....
错了错了.....
大家好...我是 玩双截棍的熊猫 ...
众所周知,EF Core是微软官方提供的ORM,功能强大,支持各种骚操作 babalaballba...
但是!当你(想)使用Oracle时,狗蛋的Oracle没有提供 EntityFrameworkCore.Oracle, 狗蛋Oracle在4月提供了 Oracle.EntityFrameworkCore 2.18.0-beta3
嗯...beta3.....
那么这个时候,找到了 Devart.Data.Oracle.EFCore ,然而这货是收费的....
我等穷逼当然用不起了,这个时候 又找到了 Citms.EntityFrameworkCore.Oracle [github地址]
于是乎你愉快的用起来了 免费/收费 的驱动.....
后来...你发现.....
狗蛋Oracle列名只支持30个字符....我改.....
狗蛋Oracle驱动对linq的支持不友好...我改....
狗蛋Oracle字符串类型最长2000字符串...没有指定长度的统统歇逼...我改...
但是为什么 code first 生成的字段和表名分大小写啊透!!!
select Id,UserName,Age from Users 报错啊透!!!没用啊透!!!手写脚本全部歇逼啊透!!!
后来你发现 select "Id","UserName","Age" from "Users" 成功查出了数据.....
为什么啊透....一个表几十个字段查询你是要我死吧.....大佬.....Orz......
此时 EFCore Fluent API 闪亮登场!!!!(此处应有掌声)
于是你这样写了.....效果也有了....(往下看??????)
相关文档链接: EFCore 映射表名称 , EFCore 映射列名称
但是....
这特么要写多少个配置...能不能给个痛快啊大佬....
很遗憾.....莫得!!!
这就很x疼了啊透...
...
...
...
对了...如果你用 PostgreSql 的话...
postgresql 和 oracle 正好 相反...
它只认小写....
沉默是今晚的康桥.....
....
...
..
.
此时 E.EntityFrameworkCore.Extensions 闪亮登场!!!!(此处应有热烈掌声)
只需几行代码,让你x不再疼!让你体验到什么叫做 "通畅"
github地址: https://github.com/staneee/E.EntityFrameworkCore.Extensions
目前已实现的功能:
- PostgreSql DbSet和 DbQeruy 表名、视图名、列名自动处理为小写
- Oracle DbSet 和 DbQuery 表名、视图名、列名自动处理为大写
- 自定义 DbSet 校验处理函数 (针对遗留代码)
- 自定义 DbQuery 校验处理函数 (针对遗留代码)
- 自定义 Column(Field) 校验处理函数 (针对PostgreSql对数据类型的丰富支持)
- 自定义列名长度,自动进行裁剪 (针对Oracle)
- 自动跳过处理 DbContext 程序集中已实现的 IEntityTypeConfiguration 和 IQueryTypeConfiguration (针对遗留代码)
基本用法
1. 引入nuget包
- dotnet cli
dotnet add package E.EntityFrameworkCore.Extensions
- nuget package manager
Install-Package E.EntityFrameworkCore.Extensions
2. 配置 DbContext
- 重写 DbContext 的 OnModelCreating 函数
- 引入命名空间
using E;
3. 配置 E.EntityFrameworkCore.Extensions
以下代码均处于 OnModelCreating 函数中
PostgreSql:
base.OnModelCreating(modelBuilder);// 设置转大写为false E.EntityFrameworkCoreTableViewExtensions.UseUpperCase = false;// 增加映射的字段类型字符串, 由于 PostgreSql 支持数据类型过于丰富,此处省略部分... E.EntityFrameworkCoreTableViewExtensions.DbMapTypes.Add("System.String[]");
E.EntityFrameworkCoreTableViewExtensions.DbMapTypes.Add("System.Boolean[]"); E.EntityFrameworkCoreTableViewExtensions.DbMapTypes.Add("System.Int32[]");// 将名为 YourContext 中的所有 DbSet 和 DbQuery 的表名、视图名、列名转换为小写 // 参数为 true,则 自动跳过处理 DbContext 程序集中已实现的 IEntityTypeConfiguration 和 IQueryTypeConfiguration modelBuilder.SetAllDbSetTableNameAndColumnName<YourContext>(/* true */); modelBuilder.SetAllDbQueryViewNameAndColumnName<YourContext>(/* true */);
Oracle:
base.OnModelCreating(modelBuilder);// 设置转大写为 true E.EntityFrameworkCoreTableViewExtensions.UseUpperCase = true;// 设置字段类型为字符串的默认长度(因为oracle限制字符串最大长度为2000), // 若字段标记 StringLength 特性 则取 StringLength 长度 E.EntityFrameworkCoreTableViewExtensions.UseDefaultStringMaxLength = true; E.EntityFrameworkCoreTableViewExtensions.DefaultStringMaxLength = 256;// 启用限制列名长度,超出长度自动裁剪(因为oracle限制列名最大长度为30) E.EntityFrameworkCoreTableViewExtensions.UseColumnNameMaxLength = true; E.EntityFrameworkCoreTableViewExtensions.ColumnNameMaxLength = 30;// 将名为 YourContext 中的所有 DbSet 和 DbQuery 的表名、视图名、列名转换为大写 // 参数为 true,则 自动跳过处理 DbContext 程序集中已实现的 IEntityTypeConfiguration 和 IQueryTypeConfiguration modelBuilder.SetAllDbSetTableNameAndColumnName<YourContext>(/* true */); modelBuilder.SetAllDbQueryViewNameAndColumnName<YourContext>(/* true */);
自定义校验处理函数
以下代码均处于 OnModelCreating 函数中
// DbSet Check E.EntityFrameworkCoreTableViewExtensions.DbSetCheck = (info) => { // 你的校验逻辑 return true;// or false };// DbQuery Check E.EntityFrameworkCoreTableViewExtensions.DbQueryCheck = (info) => { // 你的校验逻辑 return true;// or false };// Column Chcek E.EntityFrameworkCoreTableViewExtensions.ColumnCheck = (info) => { // 你的校验逻辑 return true;// or false };
看完是不是觉得 EFCore 自带的 Fluent API 弱爆了。
然鹅....这个库所有的功能都是建立在 EFCore Fluent API 之上的...哈哈哈哈哈哈哈哈...(大笑好多声 //手动滑稽)
如果觉得好用的话请 收藏 转发 star fork 一把梭哦