天天看點

FreeSql.Repository (一)什麼是倉儲

歡迎來到《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 功能逐一展開解釋。

系列文章導航

  • (一)什麼是倉儲
  • (二)如何使用倉儲
  • (三)實體特性
  • (四)工作單元
  • (五)狀态管理
  • (六)導航屬性
  • (七)多表查詢
  • (八)級聯加載
  • (九)級聯儲存
  • (十)動态實體類型
  • (十一)分表
  • (十二)如何擴充

繼續閱讀