IE盒子

搜索
查看: 88|回复: 1

基于.NET 6.0 自研轻量级ORM框架

[复制链接]

3

主题

7

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-21 15:50:40 | 显示全部楼层 |阅读模式
Fast Framework
项目:https://gitee.com/China-Mr-zhong/Fast.Framework


一、前言

1、为了实现快速开发,省去编写大量Sql时间,更好的面向对象编程由此诞生了 Fast Framework
2、Fast Framework 是一个基于.NET 6.0 封装的轻量级 ORM 框架 支持数据库 SqlServer Oracle MySql PostgreSql Sqlite 由于底层使用System.Data.Common 抽象类封装 理论支持所有http://Ado.Net 实现的类库,差异部分可能需要额外处理。
3、框架
优点:体积小 流畅API 使用更加简单 性能高
缺点:不具备有自动建库建表迁移等复杂的功能 由于不同数据库差异较大 实现较为复杂 所以暂时不考虑实现
二、项目明细 (后缀为Test均为测试项目)
1、Fast.Framework
2、Fast.Framework.CustomAttribute
3、Fast.Framework.Extensions
4、Fast.Framework.Interfaces
5、Fast.Framework.Logging
6、Fast.Framework.Models
7、Fast.Framework.Utils
三、快速入门
1、手动创建
varoptions=newDefaultDbOptions()//数据选项{DbType=DbType.MySQL,ProviderName="MySqlConnector",FactoryName="MySqlConnector.MySqlConnectorFactory,MySqlConnector",ConnectionStrings="server=localhost;database=Test;user=root;pwd=123456789;port=3306;minpoolsize=3;maxpoolsize=100;connecttimeout=30;AllowLoadLocalInfile=True;"};varado=newAdo<DefaultDbOptions>(options);//原生Adovardb=newDbContext<DefaultDbOptions>(ado);//数据库上下文2、依赖注入varbuilder=WebApplication.CreateBuilder(args);//正式项目请用配置文件注入,为了测试方便直接引用实现类库builder.Services.AddScoped<IAdo<DefaultDbOptions>,Ado<DefaultDbOptions>>();builder.Services.AddScoped<IDbContext<DefaultDbOptions>,DbContext<DefaultDbOptions>>();3、加载Json配置文件builder.Services.Configure<DefaultDbOptions>(configuration.GetSection("DbFactory:MySqlDb"));4、Json 格式"DbFactory":{"MySQLDb":{"DbType":"MySQL","ProviderName":"MySqlConnector","FactoryName":"MySqlConnector.MySqlConnectorFactory,MySqlConnector","ConnectionStrings":"server=localhost;database=Test;user=root;pwd=123456789;port=3306;minpoolsize=3;maxpoolsize=100;connecttimeout=30;"},"SQLServerDb":{"DbType":"SQLServer","ProviderName":"System.Data.SqlClient","FactoryName":"System.Data.SqlClient.SqlClientFactory,System.Data","ConnectionStrings":"server=localhost;database=Test;user=sa;pwd=123456789;minpoolsize=3;maxpoolsize=100;connecttimeout=30;"},"OracleDb":{"DbType":"Oracle","ProviderName":"Oracle.ManagedDataAccess.Client","FactoryName":"Oracle.ManagedDataAccess.Client.OracleClientFactory,Oracle.ManagedDataAccess","ConnectionStrings":"datasource=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)));userid=system;password=Oracle2022;minpoolsize=3;maxpoolsize=100;connecttimeout=30;"},"PostgreSQLDb":{"DbType":"PostgreSQL","ProviderName":"Npgsql","FactoryName":"Npgsql.NpgsqlFactory,Npgsql","ConnectionStrings":"host=localhost;database=test;userid=postgres;pwd=123456789;port=5432;"},"SQLiteDb":{"DbType":"SQLite","ProviderName":"System.Data.SQLite","FactoryName":"System.Data.SQLite.SQLiteFactory,System.Data.SQLite","ConnectionStrings":"datasource=mysqlite.db;pooling=true;"}}5、Controller 构造方法注入已注册的DbContext对象namespaceFast.Framework.Web.Test.Controllers{[Route("api/[controller]/[action]")][ApiController]publicclassProductController:ControllerBase{///<summary>///数据库///</summary>privatereadonlyIDbContext<DefaultDbOptions>db;///<summary>///日志///</summary>privatereadonlyILogger<ProductController>logger;///<summary>///构造方法///</summary>///<paramname="db"></param>publicProductController(ILogger<ProductController>logger,IDbContext<DefaultDbOptions>db){this.db=db;this.logger=logger;}}}6、示例#region增删改//实体对象插入{varresult=awaitdb.Insert(newProductModel(){ProductCode="1001",ProductName="测试产品1"}).ExecuteAsync();Console.WriteLine(result);}//实体对象插入并返回自增ID仅支持SQLServerMysqlSqlite{varresult=awaitdb.Insert(newProductModel(){ProductCode="1001",ProductName="测试产品1"}).ExecuteReturnIdentityAsync();Console.WriteLine(result);}//实体对象列表插入列表插入不支持批量返回自增ID{varlist=newList<ProductModel>();list.Add(newProductModel(){ProductCode="1001",ProductName="测试产品1"});list.Add(newProductModel(){ProductCode="1002",ProductName="测试产品2"});varresult=awaitdb.Insert(list).ExecuteAsync();Console.WriteLine(result);}//匿名对象插入必须使用As方法显示指定表名称{varresult=db.Insert(new{ProductCode="1001",ProductName="测试产品1"}).As("Product").ExecuteAsync();Console.WriteLine(result);}//匿名对象列表插入必须使用As显示指定表名称{varlist=newList<object>();list.Add(new{ProductCode="1001",ProductName="测试产品1"});list.Add(new{ProductCode="1002",ProductName="测试产品2"});varresult=awaitdb.Insert(list).As("Product").ExecuteAsync();Console.WriteLine(result);}//实体无条件删除{varresult=awaitdb.Delete<ProductModel>().ExecuteAsync();Console.WriteLine(result);}//实体条件删除{varresult=awaitdb.Delete<ProductModel>().Where(w=>w.ProductId==1).ExecuteAsync();Console.WriteLine(result);}//父类对象删除{varresult=db.Delete<object>().As("Product").ExecuteAsync();Console.WriteLine(result);}//匿名对象条件删除{varobj=new{ProductCode="测试"};varresult=awaitdb.Delete(obj).Where(w=>w.ProductCode==obj.ProductCode).As("Product").ExecuteAsync();Console.WriteLine(result);}//实体对象无条件更新{varresult=awaitdb.Update(newProductModel(){ProductCode="1001",ProductName="测试产品1"}).ExecuteAsync();Console.WriteLine(result);}//实体对象条件更新{varresult=awaitdb.Update(newProductModel(){ProductCode="1001",ProductName="测试产品1"}).Where(w=>w.ProductId==1).ExecuteAsync();Console.WriteLine(result);}//实体对象列表更新{varlist=newList<ProductModel>();for(inti=0;i<10;i++){list.Add(newProductModel(){ProductId=16395+i,ProductCode=$"{16395+i}",ProductName=$"{16395+i}"});}varresult=awaitdb.Update(list).ExecuteAsync();Console.WriteLine(result);}//匿名对象无条件更新{varresult=awaitdb.Update(new{ProductCode="1001",ProductName="测试产品1"}).As("Product").ExecuteAsync();Console.WriteLine(result);}//匿名对象条件更新{varresult=awaitdb.Update(new{ProductId=1,ProductCode="1001",ProductName="测试产品1"}).Where(w=>w.ProductId==1).As("Product").ExecuteAsync();Console.WriteLine(result);}//匿名对象列表更新需要显示指定主键名称{varlist=newList<object>();for(inti=0;i<10;i++){list.Add(new{ProductId=16395+i,ProductCode=$"{16395+i}",ProductName=$"{16395+i}"});}varresult=awaitdb.Update(list.ToList()).As("Product").Where("ProductId").ExecuteAsync();Console.WriteLine(result);}#endregion#region查//返回单个对象{vardata=awaitdb.Query<ProductModel>().Where(w=>w.ProductId==1).FirstAsync();}//返回列表{vardata=awaitdb.Query<ProductModel>().ToListAsync();}//返回字典{vardata=awaitdb.Query<ProductModel>().DictionaryAsync();}//返回字典列表{vardata=awaitdb.Query<ProductModel>().DictionaryListAsync();}//分页查询{vardata=awaitdb.Query<ProductModel>().ToPageListAsync(1,10);Console.WriteLine(JsonSerializer.Serialize(data.Data));//页数据Console.WriteLine($"总数:{data.Count}");}//联表查询{vardata=awaitdb.Query<ProductModel>().InnerJoin<ProductCategoryModel>((a,b)=>a.CategoryId==b.CategoryId).ToListAsync();}//分组查询{vardata=awaitdb.Query<ProductModel>().GroupBy(g=>g.ProductName).Select(s=>new{Count=1.Count(),s.ProductName}).ToListAsync();}//排序查询{vardata=awaitdb.Query<ProductModel>().OrderBy(o=>o.ProductName).ToListAsync();}//动态条件表达式{varobj=new{ProductName="测试"};varex=DynamicWhereExpression.Create<ProductModel>().AndIF(!string.IsNullOrWhiteSpace(obj.ProductName),a=>a.ProductName==obj.ProductName);vardata=awaitdb.Query<ProductModel>().Where(ex.Build()).ToListAsync();}//合并查询{varquery1=db.Query<ProductModel>().Where(w=>w.ProductId<100);varquery2=db.Query<ProductModel>().Where(w=>w.ProductId>100);vardata=awaitdb.UnionAll(query1,query2).ToListAsync();}#endregion#region批量复制建议数据量达到500以上使用这个方法仅支持SqlServerMySqlOraclePostgreSql{varlist=newList<ProductModel>();for(inti=1;i<=10000;i++){list.Add(newProductModel(){ProductCode=i.ToString(),ProductName=$"测试{i}"});}//因为ProductModel类还有其它属性所以需要使用Select扩展方法显示指定要导入的属性名称和表名称varresult=awaitdb.BigData().BulkCopyAsync(list.Select(s=>new{s.ProductCode,s.ProductName}),"Product");Console.WriteLine(result);}#endregion方法太多 写文档是个体力活 更多请看源码https://gitee.com/China-Mr-zhong/Fast.Framework

转自:China-Mr-zhong
链接:http://cnblogs.com/China-Mr-zhong/p/15992962.html
回复

使用道具 举报

3

主题

8

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2022-12-21 15:50:59 | 显示全部楼层
我本来学JAVA,现在拿了个c#offer,不知道未来发展怎么样
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表