[大霧霧霧霧] 告別該死的 EFCore Fluent API


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM