FreeSql.DbContext 该对象 Select/Delete/Insert/Update/InsertOrUpdate 与 DbContext 事务保持一致,可省略传递 WithTransaction 添加 更新 删除 添加或更新 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) 场景:在关闭级联保存功能之后,手工使用本方法 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 实体对象 属性名 附加实体,可用于不查询就更新或删除 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 比较实体,计算出值发生变化的属性,以及属性变化的前后值 最新的实体对象,它将与附加实体的状态对比 key: 属性名, value: [旧值, 新值] Type = Update 的时候,获取更新之前的对象 实体变化记录 实体变化事件 刷新队列中的命令 是否开启 一对一(OneToOne)、一对多(OneToMany)、多对多(ManyToMany) 级联保存功能 【一对一】模型下,保存时级联保存 OneToOne 属性。 【一对多】模型下,保存时级联保存 OneToMany 集合属性。出于安全考虑我们没做完整对比,只针对实体属性集合的添加或更新操作,因此不会删除数据库表已有的数据。 完整对比的功能使用起来太危险,试想下面的场景: - 保存的时候,实体的属性集合为空时(!=null),表记录全部删除? - 保存的时候,由于数据库子表的记录很多,只想保存子表的部分数据,又或者只需要添加,如何操作? 【多对多】模型下,对中间表的保存是完整对比操作,对外部实体的只作新增操作(*注意不会更新) - 属性集合为空时(!=null),删除他们的所有关联数据(中间表) - 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录 因增加支持 OneToOne 级联保存,和基于内存的级联删除,已改名为 EnableCascadeSave 使用无参数化设置(对应 IInsert/IUpdate) 是否开启 IFreeSql GlobalFilter 功能(默认:true) 实体变化事件 动态Type,在使用 DbSet<object> 后使用本方法,指定实体类型 附加实体,可用于不查询就更新或删除 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 比较实体,计算出值发生变化的属性,以及属性变化的前后值 最新的实体对象,它将与附加实体的状态对比 key: 属性名, value: [旧值, 新值] 清空状态数据 添加 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) 场景:在关闭级联保存功能之后,手工使用本方法 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 实体对象 属性名 更新 删除 根据 lambda 条件删除数据 添加或更新 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行 场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】 示例:https://github.com/dotnetcore/FreeSql/issues/397 注意:* 本方法只支持单表操作,不支持导航属性级联保存 完成编辑数据,进行保存动作 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句 注意:* 本方法只支持单表操作,不支持导航属性级联保存 可选参数:手工传递最终的 data 值进行对比默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比 根据设置的 OneToOne/OneToMany/ManyToMany 导航属性,级联查询所有的数据库记录,删除并返回它们 使用 FreeSql FluentApi 方法,当 EFCore FluentApi 方法无法表示的时候使用 使用 FreeSql FluentApi 方法,当 EFCore FluentApi 方法无法表示的时候使用 使用 Repository + EnableCascadeSave + NoneParameter 方式插入种子数据 使用 FreeSql FluentApi 方法,当 EFCore FluentApi 方法无法表示的时候使用 使用 Repository + EnableCascadeSave + NoneParameter 方式插入种子数据 在工作单元内创建默认仓库类,工作单元下的仓储操作具有事务特点 数据过滤 + 验证 在工作单元内创建联合主键的仓储类,工作单元下的仓储操作具有事务特点 数据过滤 + 验证 在工作单元内创建仓库类,工作单元下的仓储操作具有事务特点 数据过滤 + 验证 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository 开启过滤器,若使用 using 则使用完后,恢复为原有状态 过滤器名称 开启所有过滤器,若使用 using 则使用完后,恢复为原有状态 禁用过滤器,若使用 using 则使用完后,恢复为原有状态 禁用所有过滤器,若使用 using 则使用完后,恢复为原有状态 动态Type,在使用 Repository<object> 后使用本方法,指定实体类型 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository 设置 DbContext 选项 清空状态数据 附加实体,可用于不查询就更新或删除 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 比较实体,计算出值发生变化的属性,以及属性变化的前后值 最新的实体对象,它将与附加实体的状态对比 key: 属性名, value: [旧值, 新值] 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) 场景:在关闭级联保存功能之后,手工使用本方法 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 实体对象 属性名 根据设置的 OneToOne/OneToMany/ManyToMany 导航属性,级联查询所有的数据库记录,删除并返回它们 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行 场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】 示例:https://github.com/dotnetcore/FreeSql/issues/397 注意:* 本方法只支持单表操作,不支持导航属性级联保存 完成编辑数据,进行保存动作 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句 注意:* 本方法只支持单表操作,不支持导航属性级联保存 可选参数:手工传递最终的 data 值进行对比默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比 工作单元 该对象 Select/Delete/Insert/Update/InsertOrUpdate 与工作单元事务保持一致,可省略传递 WithTransaction 开启事务,或者返回已开启的事务 若未开启事务,则开启 工作单元内的实体变化跟踪 用户自定义的状态数据,便于扩展 正在使用中的工作单元(调试) 开启事务后有值,是 UnitOfWork 的唯一标识 格式:yyyyMMdd_HHmmss_种子id 例如:20191121_214504_1 工作单元管理器 当前的工作单元 将仓储的事务交给我管理 创建工作单元 事务传播方式 事务隔离级别 事务传播方式 如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,默认的选择。 支持当前事务,如果没有当前事务,就以非事务方法执行。 使用当前事务,如果没有当前事务,就抛出异常。 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 以非事务方式执行操作,如果当前事务存在则抛出异常。 以嵌套事务方式执行。 EFCore 95% 相似的 FluentApi 扩展方法 EFCore 95% 相似的 FluentApi 扩展方法 实体类型 创建普通数据上下文档对象 不跟踪查询的实体数据(在不需要更新其数据时使用),可提升查询性能 设置 DbContext 选项设置 返回默认仓库类 数据过滤 + 验证 返回默认仓库类,适用联合主键的仓储类 数据过滤 + 验证 返回仓库类 数据过滤 + 验证 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository 创建基于仓储功能的工作单元,务必使用 using 包含使用 批量注入 Repository,可以参考代码自行调整