FreeSql.DbContext 该对象 Select/Delete/Insert/Update/InsertOrUpdate 与 DbContext 事务保持一致,可省略传递 WithTransaction 添加 更新 删除 添加或更新 附加实体,可用于不查询就更新或删除 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 比较实体,计算出值发生变化的属性,以及属性变化的前后值 最新的实体对象,它将与附加实体的状态对比 key: 属性名, value: [旧值, 新值] Type = Update 的时候,获取更新之前的对象 实体类型 实体变化记录 实体变化事件 刷新队列中的命令 AddFreeDbContext 发生错误,请检查 {dbContextTypeName} 的构造参数都已正确注入 不可添加,已存在于状态管理:{entityString} 不可添加,实体没有主键:{entityString} 不可添加,未设置主键的值:{entityString} 不可添加,自增属性有值:{entityString} 不可附加,实体没有主键:{entityString} 不可附加,未设置主键的值:{entityString} 不可删除,数据未被跟踪,应该先查询:{entityString} 不可删除,实体没有主键:{entityString} 不可删除,未设置主键的值:{entityString} 不可进行编辑,实体没有主键:{entityString} 不可更新,数据未被跟踪,应该先查询 或者 Attach:{entityString} 不可更新,实体没有主键:{entityString} 不可更新,未设置主键的值:{entityString} 不可更新,数据库不存在该记录:{entityString} 请在 OnConfiguring 或 AddFreeDbContext 中配置 UseFreeSql DbSet.AsType 参数错误,请传入正确的实体类型 实体类型 {EntityTypeName} 无法转换为 {name},无法使用该方法 实体类型 {EntityTypeName} 主键类型不为 {fullName},无法使用该方法 实体类型 {EntityTypeName} 主键数量不为 1,无法使用该方法 FreeSql.Repository 设置过滤器失败,原因是对象不属于 IRepository 不可比较,实体没有主键:{entityString} 不可比较,未设置主键的值:{entityString} FreeSql.Repository Insert 失败,因为设置了过滤器 {filterKey}: {filterValueExpression},插入的数据不符合 {entityString} ISelect.AsType 参数不支持指定为 object {tableTypeFullName} 不存在属性 {propertyName} 找不到方法 DbSet&lt;&gt;.StatesRemoveByObjects 参数 data 类型错误 {entityTypeFullName} 参数错误 {param} 参数错误 {param} 不能为 null 参数错误 {many} 不是集合属性 参数错误 {many} 集合属性不存在 参数错误 {one} 属性不存在 Propagation_Mandatory: 使用当前事务,如果没有当前事务,就抛出异常 Propagation_Never: 以非事务方式执行操作,如果当前事务存在则抛出异常 {tableTypeFullName} 类型的属性 {propertyName} 不是 OneToMany 或 ManyToMany 特性 特别错误:批量添加失败,{dataType} 的返回数据,与添加的数目不匹配 特别错误:更新失败,数据未被跟踪:{entityString} 已开启事务,不能禁用工作单元 {tableTypeFullName} 类型已设置属性 {propertyName} 忽略特性 {unitOfWorkManager} 构造参数 {fsql} 不能为 null FreeSql.Repository Update 失败,因为设置了过滤器 {filterKey}: {filterValueExpression},更新的数据不符合{entityString} 是否开启 一对一(OneToOne)、一对多(OneToMany)、多对多(ManyToMany) 级联保存功能 【一对一】模型下,保存时级联保存 OneToOne 属性。 【一对多】模型下,保存时级联保存 OneToMany 集合属性。出于安全考虑我们没做完整对比,只针对实体属性集合的添加或更新操作,因此不会删除数据库表已有的数据。 完整对比的功能使用起来太危险,试想下面的场景: - 保存的时候,实体的属性集合为空时(!=null),表记录全部删除? - 保存的时候,由于数据库子表的记录很多,只想保存子表的部分数据,又或者只需要添加,如何操作? 【多对多】模型下,对中间表的保存是完整对比操作,对外部实体的只作新增操作(*注意不会更新) - 属性集合为空时(!=null),删除他们的所有关联数据(中间表) - 属性集合不为空时,与数据库存在的关联数据(中间表)完全对比,计算出应该删除和添加的记录 使用无参数化设置(对应 IInsert/IUpdate) 是否开启 IFreeSql GlobalFilter 功能(默认:true) 实体变化事件 DbContext/Repository 审计值,适合 Scoped IOC 中获取登陆信息 类型 类型 实体对象 动态Type,在使用 DbSet<object> 后使用本方法,指定实体类型 附加实体,可用于不查询就更新或删除 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 比较实体,计算出值发生变化的属性,以及属性变化的前后值 最新的实体对象,它将与附加实体的状态对比 key: 属性名, value: [旧值, 新值] 清空状态数据 添加 更新 删除 根据 lambda 条件删除数据 添加或更新 开始编辑数据,然后调用方法 EndEdit 分析出添加、修改、删除 SQL 语句进行执行 场景:winform 加载表数据后,一顿添加、修改、删除操作之后,最后才点击【保存】 示例:https://github.com/dotnetcore/FreeSql/issues/397 注意:* 本方法只支持单表操作,不支持导航属性级联保存 完成编辑数据,进行保存动作 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句 注意:* 本方法只支持单表操作,不支持导航属性级联保存 可选参数:手工传递最终的 data 值进行对比默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比 根据设置的 OneToOne/OneToMany/ManyToMany 导航属性,级联查询所有的数据库记录,删除并返回它们 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) 场景:在关闭级联保存功能之后,手工使用本方法 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 实体对象 属性名 使用 FreeSql FluentApi 方法,当 EFCore FluentApi 方法无法表示的时候使用 使用 FreeSql FluentApi 方法,当 EFCore FluentApi 方法无法表示的时候使用 使用 Repository + EnableCascadeSave + NoneParameter 方式插入种子数据 使用 FreeSql FluentApi 方法,当 EFCore FluentApi 方法无法表示的时候使用 使用 Repository + EnableCascadeSave + NoneParameter 方式插入种子数据 在工作单元内创建联合主键的仓储类,工作单元下的仓储操作具有事务特点 开启过滤器,若使用 using 则使用完后,恢复为原有状态 过滤器名称 开启所有过滤器,若使用 using 则使用完后,恢复为原有状态 禁用过滤器,若使用 using 则使用完后,恢复为原有状态 禁用所有过滤器,若使用 using 则使用完后,恢复为原有状态 动态Type,在使用 Repository<object> 后使用本方法,指定实体类型 分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository 分表规则,参数:实体类型、旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository 设置 DbContext 选项 GlobalFilter 禁用/启用控制 清空状态数据 附加实体,可用于不查询就更新或删除 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 比较实体,计算出值发生变化的属性,以及属性变化的前后值 最新的实体对象,它将与附加实体的状态对比 key: 属性名, value: [旧值, 新值] 根据设置的 OneToOne/OneToMany/ManyToMany 导航属性,级联查询所有的数据库记录,删除并返回它们 保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比) 场景:在关闭级联保存功能之后,手工使用本方法 例子:保存商品的 OneToMany 集合属性,SaveMany(goods, "Skus") 当 goods.Skus 为空(非null)时,会删除表中已存在的所有数据 当 goods.Skus 不为空(非null)时,添加/更新后,删除表中不存在 Skus 集合属性的所有记录 实体对象 属性名 开始编辑数据,然后调用方法 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 工作单元管理器 当前的工作单元 将仓储的事务交给我管理 创建工作单元 事务传播方式 事务隔离级别 工作单元管理器 当前的工作单元 将仓储的事务交给我管理 将DbContext的事务交给我管理 创建工作单元 事务传播方式 事务隔离级别 事务传播方式 如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,默认的选择。 支持当前事务,如果没有当前事务,就以非事务方法执行。 使用当前事务,如果没有当前事务,就抛出异常。 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 以非事务方式执行操作,如果当前事务存在则抛出异常。 以嵌套事务方式执行。 EFCore 95% 相似的 FluentApi 扩展方法 EFCore 95% 相似的 FluentApi 扩展方法 实体类型 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 创建普通数据上下文档对象 不跟踪查询的实体数据(在不需要更新其数据时使用),可提升查询性能 设置 DbContext 选项设置 返回默认仓库类,适用联合主键的仓储类 创建基于工作单元,务必使用 using 包含使用