FreeSql介绍
FreeSql是一款功能强大的对象关系映射(O/RM)组件,支持 .NET Core 2.1+、.NET Framework 4.0+、Xamarin,国产首个支持 AOT 发布的 ORM
1. 多场景实现
CodeFirst/DbFirst/DbContext/Repository/UnitOfWork/AOP/
支持.NETCore 2.1+,.NETFramework 4.0+,AOT,Xamarin
2. 多数据库支持(常用的数据库以注明颜色)
Mysql、SqlServer、PostgreSQL、Oracle、Sqlite3 ,Firebird
达梦、人大金仓、南大通用、虚谷、瀚高、ClickHouse、
QuestDB、Access 等数据库
3. 特性
DbFirst:支持DbFirst模式,支持从数据库导入实体类、或者使用实体类工具生成实体类
丰富的表达式函数:支持丰富的表达式函数,以及灵活的自定义解析;
读写分离: 支持读写分离 分表分库 过滤器 租户设计
导航属性: 支持一对多 多对多贪婪加载、已及延时加载
异步同步:支持同步/异步数据库操作方法,丰富多彩的链式查询方法
CodeFirst: 支持 CodeFirst 迁移
采用 ExpressionTree 高性能读取数据
注:文档总结略有不足 可查看官方文档
______ ____ __
/ ____/ ____ ___ ___ / __/ ___ _ / /
/ __/ / __/ / -_)/ -_) _\ \ / _ `/ / /
/_/ /_/ \__/ \__/ /___/ \_, / /_/
/_/
下载与使用
FreeSql使用方法
下载两个nuget包
FreeSql 下载最新版就行了
Freesql.Provider.(mysql/splserver/postgreSQL) 支持任何数据库 需要哪个用哪个
2.建一个实体类
这个引用需要 手动输入 using FreeSql.DataAnnotations;
表名 [Table(Name="XXX")]
主键 [Column(IsIdentity = true, IsPrimary = true)]
IsPrimary =主键 IsIdentity =是否自增
3. Program.cs
数据库是PostgreSQL
CodeFirst
1.这段代码定义了一个函数,它可以根据提供的 IServiceProvider 创建一个 IFreeSql 实例,用于与 PostgreSQL 数据库进行交互,并具有 SQL 命令监听和自动同步实体结构到数据库的功能。这个函数通常用于依赖注入容器中,以便在应用程序的不同部分共享和重用数据库连接和配置。
2.用于实现控制反转(Inversion of Control,简称IoC),以减少代码之间的耦合度,提高代码的可测试性和可维护性
3.确保在应用程序启动时执行。这样做的好处是,每当应用程序启动时,都会检查并更新数据库结构,以匹配当前的实体类定义(注: 这是CodeFirst优先 如果是DbFirst优先了解下面代码)
4.增删改查方法(这是封装的方法)
ExecuteAffrows() 这个方法一般使用在 (增(Insert) 删(Delete) 改(Update))
常用执行SQL命令 并返回受影响行数
public interface ISetRepository<T> where T : class,new()
{
Task<T> GetAsync(Expression<Func<T, bool>> expression);
Task<int> CreateAsync(T entity);
Task<int> DeleteAsync(int id);
Task<int> DeleteAllAsync(string ids);
Task<int> UpdateLocality(Expression<Func<T, bool>> expression, Expression<Func<T, bool>> result);
Task<int> UpdateInfo(T entity);
}
具体实现
public class SetBaseRepository<T> : ISetRepository<T> where T : class, new()
{
private readonly IFreeSql freeSql;
public SetBaseRepository(IFreeSql freeSql)
{
this.freeSql = freeSql;
}
/// <summary>
/// 添加方法(异步)
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<int> CreateAsync(T entity)
{
return await freeSql.Insert(entity).ExecuteAffrowsAsync();
}
/// <summary>
/// 添加方法(异步)
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<int> DeleteAllAsync(string ids)
{
var id = ids.Split(',');
foreach (var item in id)
{
await freeSql.Delete<T>(Convert.ToInt32(item)).ExecuteAffrowsAsync();
}
return 1;
}
/// <summary>
/// 删除方法
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<int> DeleteAsync(int id)
{
return await freeSql.Delete<T>(id).ExecuteAffrowsAsync();
}
/// <summary>
/// 返回数据
/// </summary>
/// <param name="expression"></param>
/// <returns></returns>
public async Task<T> GetAsync(Expression<Func<T, bool>> expression)
{
return await freeSql.Select<T>().Where(expression).FirstAsync();
}
/// <summary>
/// 修改方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<int> UpdateInfo(T entity)
{
var list = freeSql.GetRepository<T>();
return await list.UpdateAsync(entity);
}
/// <summary>
/// 修改以及局部修改
/// </summary>
/// <param name="expression"></param>
/// <param name="result"></param>
/// <returns></returns>
public async Task<int> UpdateLocality(Expression<Func<T, bool>> expression, Expression<Func<T, bool>> result)
{
return await freeSql.Update<T>().Where(expression).Set(result).ExecuteAffrowsAsync();
}
}