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 方式插入种子数据
String resources used in FreeSql exceptions, etc.
These strings are exposed publicly for use by database providers and extensions.
It is unusual for application code to need these strings.
重写当前线程的 CurrentUICulture 属性,对
使用此强类型资源类的所有资源查找执行重写。
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<>.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}
在工作单元内创建默认仓库类,工作单元下的仓储操作具有事务特点
数据过滤 + 验证
在工作单元内创建联合主键的仓储类,工作单元下的仓储操作具有事务特点
数据过滤 + 验证
在工作单元内创建仓库类,工作单元下的仓储操作具有事务特点
数据过滤 + 验证
分表规则,参数:旧表名;返回:新表名 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 包含使用