当前位置: 代码迷 >> 综合 >> [大雾雾雾雾] 告别该死的 EFCore Fluent API
  详细解决方案

[大雾雾雾雾] 告别该死的 EFCore Fluent API

热度:8   发布时间:2023-12-14 20:32:17.0

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

 

 

转载于:https://www.cnblogs.com/staneee/p/10826022.html