Loading

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 功能逐一展开解释。

系列文章导航

posted @ 2020-12-11 12:03  FreeSql  阅读(7121)  评论(8编辑  收藏  举报