zoukankan      html  css  js  c++  java
  • 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 功能逐一展开解释。

    系列文章导航

  • 相关阅读:
    模拟最烂的网速
    TableView编辑状态下跳转页面的崩溃处理
    Swift的Optional类型
    autolayout之后获取uiview的frame
    Swift中的闭包(Closure)[转]
    Swift1.2与Xcode6.3 beta
    python技巧31[python中使用enum][转]
    Python初学者的捷径[译]
    tornado+bootstrap急速搭建你自己的网站
    Windows下nginx+tomcat实现简单的负载均衡、动静分离等
  • 原文地址:https://www.cnblogs.com/FreeSql/p/14118451.html
Copyright © 2011-2022 走看看