FreeSql是一个功能强大的 .NET ORM 功能库,支持 .NetFramework 4.0+、.NetCore 2.1+、Xamarin 等支持 NetStandard 所有运行平台。
特性
- 支持 CodeFirst 迁移;
- 支持 DbFirst 从数据库导入实体类,支持三种模板生成器;
- 采用 ExpressionTree 高性能读取数据;
- 支持深入的类型映射,比如pgsql的数组类型,堪称匠心制作;
- 支持丰富的表达式函数;
- 支持导航属性查询,和延时加载;
- 支持同步/异步数据库操作方法,丰富多彩的链式查询方法;
- 支持读写分离、分表分库,租户设计;
- 支持多种数据库,MySql/SqlServer/PostgreSQL/Oracle/Sqlite/达梦/MsAccess;
开源地址:https://github.com/2881099/FreeSql
第一步:定义注入类型
public class CurdAfterLog : IDisposable
{
public static AsyncLocal<CurdAfterLog> Current = new AsyncLocal<CurdAfterLog>();
public StringBuilder Sb { get; } = new StringBuilder();
public CurdAfterLog()
{
Current.Value = this;
}
public void Dispose()
{
Sb.Clear();
Current.Value = null;
}
}
第二步:注入 CurdAfterLog
services.AddSingleton<IFreeSql>(fsql);
services.AddScoped<CurdAfterLog>();
第三步:添加 CurdAfter 事件
fsql.Aop.CurdAfter += (s, e) =>
{
CurdAfterLog.Current.Value?.Sb.AppendLine($"{Thread.CurrentThread.ManagedThreadId}: {e.EntityType.FullName} {e.ElapsedMilliseconds}ms, {e.Sql}");
};
便于管理 fsql.Aop.CurdAfter 应该和 new FreeSqlBuilder()..Build() 代码放在一起,并且该事件只绑定一次
第四步:在 Controller 中测试
public class ValuesController : ControllerBase
{
IFreeSql _fsql;
CurdAfterLog _curdLog;
public ValuesController(IFreeSql fsql, CurdAfterLog curdLog)
{
_fsql = fsql;
_curdLog = curdLog;
}
public ActionResult<string> Get(int id)
{
var item1 = _orm.Select<Song>().Where(a => a.Id == id).First();
var item2 = _orm.Select<Song>().Where(a => a.Id == id).First();
return _curdLog.Sb.ToString();
}
}
参考资料
《新人学习指引》 | 《Select》 | 《Update》 | 《Insert》 | 《Delete》 | |
《表达式函数》 | 《CodeFirst》 | 《DbFirst》 | 《BaseEntity》 | |
《Repository》 | 《UnitOfWork》 | 《过滤器》 | 《乐观锁》 | 《DbContext》 | |
《读写分离》 | 《分区分表》 | 《租户》 | 《AOP》 | 《黑科技》 | 更新日志 |
来源:oschina
链接:https://my.oschina.net/u/4072691/blog/3190343