using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Threading.Tasks; namespace FreeSql { public interface IBaseRepository : IDisposable { Type EntityType { get; } IUnitOfWork UnitOfWork { get; set; } IFreeSql Orm { get; } /// /// 动态Type,在使用 Repository<object> 后使用本方法,指定实体类型 /// /// /// void AsType(Type entityType); /// /// 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository /// /// void AsTable(Func rule); /// /// 设置 DbContext 选项 /// DbContextOptions DbContextOptions { get; set; } } public interface IBaseRepository : IBaseRepository where TEntity : class { IDataFilter DataFilter { get; } ISelect Select { get; } ISelect Where(Expression> exp); ISelect WhereIf(bool condition, Expression> exp); TEntity Insert(TEntity entity); List Insert(IEnumerable entitys); /// /// 清空状态数据 /// void FlushState(); /// /// 附加实体,可用于不查询就更新或删除 /// /// void Attach(TEntity entity); void Attach(IEnumerable entity); /// /// 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 /// /// IBaseRepository AttachOnlyPrimary(TEntity data); int Update(TEntity entity); int Update(IEnumerable entitys); TEntity InsertOrUpdate(TEntity entity); /// /// 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) /// 场景:在关闭级联保存功能之后,手工使用本方法 /// 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") /// 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 /// 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 /// /// 实体对象 /// 属性名 void SaveMany(TEntity entity, string propertyName); IUpdate UpdateDiy { get; } int Delete(TEntity entity); int Delete(IEnumerable entitys); int Delete(Expression> predicate); /// /// 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行 /// 场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】 /// 示例:https://github.com/dotnetcore/FreeSql/issues/397 /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存 /// /// void BeginEdit(List data); /// /// 完成编辑数据,进行保存动作 /// 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句 /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存 /// /// 可选参数:手工传递最终的 data 值进行对比默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比 /// int EndEdit(List data = null); #if net40 #else Task InsertAsync(TEntity entity); Task> InsertAsync(IEnumerable entitys); Task UpdateAsync(TEntity entity); Task UpdateAsync(IEnumerable entitys); Task InsertOrUpdateAsync(TEntity entity); Task SaveManyAsync(TEntity entity, string propertyName); Task DeleteAsync(TEntity entity); Task DeleteAsync(IEnumerable entitys); Task DeleteAsync(Expression> predicate); #endif } public interface IBaseRepository : IBaseRepository where TEntity : class { TEntity Get(TKey id); TEntity Find(TKey id); int Delete(TKey id); #if net40 #else Task GetAsync(TKey id); Task FindAsync(TKey id); Task DeleteAsync(TKey id); #endif } }