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 數據庫。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 功能逐一展開解釋。

系列文章導航


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM