歡迎來到《FreeSql.Repository 倉儲模式》系列文件,完整文件請前往 wiki 中心:https://github.com/dotnetcore/FreeSql/wiki
FreeSql是功能強大的 .NET ORM,支援 .NetFramework 4.0+、.NetCore 2.1+、Xamarin 等支援 NetStandard 所有執行平臺。支援 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/達夢/神通/人大金倉/翰高/MsAccess 資料庫。QQ群:4336577(已滿)、8578575(線上)、52508226(線上)
FreeSql 支援五種使用方式,根據實際情況選擇團隊合適的一種:
- 要麼 FreeSql,原始用法;
- 要麼 FreeSql.Repository,倉儲+工作單元習慣;
- 要麼 FreeSql.DbContext,有點像 EFCore 的使用習慣;
- 要麼 FreeSql.BaseEntity,求簡單使用這個;
- 要麼 IDbConnection CRUD,有點像 Dapper;
本系列文件,專注介紹 【倉儲+工作單元】 的使用方式。
理解倉儲
倉儲是一種設計模式概念,不同於以往的 DAL,在 .NET 世界人們往往把倉儲向 DDD 靠近,又把 EFCore 向 DDD 靠近。
我理解的倉儲對標 JPA,更像一種 ORM 規範,使得應用程式不再深度依賴某一個特定的 ORM。
使用倉儲的目標:能低成本的切換 ORM
倉儲功能
- 插入、批量插入;
- 更新、批量更新;
- 刪除、批量刪除;
- 查詢;
- 實現工作單元事務;
以上幾點是倉儲的幾個基本功能要求,定義不宜複雜,越複雜最終切換 ORM 越困難。
簡單的倉儲介面定義如下:
- IBaseRepository
- IBaseRepository<TEntity>
- IBaseRepository<TEntity, TKey>
public interface IBaseRepository : IDisposable
{
Type EntityType { get; }
IUnitOfWork UnitOfWork { get; set; }
}
public interface IBaseRepository<TEntity> : IBaseRepository
where TEntity : class
{
IDataFilter<TEntity> DataFilter { get; }
ISelect<TEntity> Select { get; }
ISelect<TEntity> Where(Expression<Func<TEntity, bool>> exp);
ISelect<TEntity> WhereIf(bool condition, Expression<Func<TEntity, bool>> exp);
TEntity Insert(TEntity entity);
List<TEntity> Insert(IEnumerable<TEntity> entitys);
int Update(TEntity entity);
int Update(IEnumerable<TEntity> entitys);
TEntity InsertOrUpdate(TEntity entity);
int Delete(TEntity entity);
int Delete(IEnumerable<TEntity> entitys);
int Delete(Expression<Func<TEntity, bool>> predicate);
}
public interface IBaseRepository<TEntity, TKey> : IBaseRepository<TEntity>
where TEntity : class
{
TEntity Get(TKey id);
TEntity Find(TKey id);
int Delete(TKey id);
}
FreeSql.Repository
倉儲定義越簡單,切換 ORM 越容易沒錯,但是開發起來也越麻煩,魚和熊掌不可兼得,需要找到一個平衡點。
FreeSql.Repository 在基本功能上有額外的定義:
- 狀態管理,只更新變化的欄位;
- 支援使用導航屬性、多表查詢、級聯載入、級聯儲存;
- 動態實體型別的 CRUD;
- 過濾器;
後續文章將對 FreeSql.Repository 功能逐一展開解釋。