大家好,我是 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 一把梭哦