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
}
}