大家好, 我是 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