歡迎來到《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/ClickHouse 資料庫。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 功能逐一展開解釋。
系列文章導航
- (一)什麼是倉儲
- (二)如何使用倉儲
- (三)實體特性
- (四)工作單元
- (五)狀态管理
- (六)導航屬性
- (七)多表查詢
- (八)級聯加載
- (九)級聯儲存
- (十)動态實體類型
- (十一)分表
- (十二)如何擴充