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

玩雙截棍的熊貓發表於2019-05-07

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

 

 

相關文章