[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 一把梭哦