From cc179602024359eca25e4f9c99717da9d759c388 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sun, 24 Nov 2024 14:13:25 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20Repository=20+=20Audit?= =?UTF-8?q?Value=20+=20Attach=20=E9=97=AE=E9=A2=98=EF=BC=9B#1931=20#1746?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 26 +- FreeSql.DbContext/DbSet/DbSet.cs | 7 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql/Extensions/EntityUtilExtensions.cs | 6 +- FreeSql/FreeSql.xml | 430 ++++++++++----------- 5 files changed, 232 insertions(+), 239 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index c22994491..3056d9fe9 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -574,7 +574,7 @@ namespace base_entity //.UseSlaveWeight(10, 1, 1, 5) - .UseConnectionString(FreeSql.DataType.Firebird, @"database=localhost:D:\fbdata\EXAMPLES.fdb;user=sysdba;password=123456;max pool size=5") + //.UseConnectionString(FreeSql.DataType.Firebird, @"database=localhost:D:\fbdata\EXAMPLES.fdb;user=sysdba;password=123456;max pool size=5") //.UseQuoteSqlName(false) //.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;min pool size=1;Max pool size=3;AllowLoadLocalInfile=true") @@ -619,6 +619,18 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + fsql.Aop.AuditValue += (_, e) => + { + + }; + + var tt1 = new ProjectItem { ID = 1, MaxQuantity = 0, Code = null, Name = null }; + var tt2 = new ProjectItem { ID = 1, MaxQuantity = 100, Code = null, Name = null }; + var repot2 = fsql.GetRepository(); + + repot2.Attach(tt1); + var nt1 = repot2.Update(tt2); + fsql.Delete().Where("1=1").ExecuteAffrows(); fsql.Insert(new List { @@ -721,17 +733,7 @@ namespace base_entity fsql.Select().Where(a => a.Id == new Guid("xxx")).ToList(a => new Guid("zzz")); - fsql.Aop.AuditValue += (_, e) => - { - - }; - - var tt1 = new ProjectItem { ID = 1, MaxQuantity = 0, Code = null, Name = null }; - var tt2 = new ProjectItem { ID = 1, MaxQuantity = 100, Code = null, Name = null }; - var repot2 = fsql.GetRepository(); - - repot2.Attach(tt1); - var nt1 = repot2.Update(tt2); + var fsql2 = fsql; // 动态构建实体类型,树形结构,引用自身类型 diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index b66df0505..25614a1ab 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -225,7 +225,12 @@ namespace FreeSql { if (isAuditValue) { - FreeSql.Internal.CommonProvider.UpdateProvider.AuditDataValue(this, item, _db.OrmOriginal, _table, null); //与 CanUpdate 同步 + foreach (var col in _table.Columns.Values) //#1746 + { + object val = col.GetValue(item); + if (val == null && col.Attribute.MapType == typeof(string) && col.Attribute.IsNullable == false) + col.SetValue(item, val = ""); + } _db.Options.AuditValue?.Invoke(new DbContextAuditValueEventArgs(Aop.AuditValueType.Update, _table.Type, item)); } var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false); diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index f049676ee..a61d4ba51 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.5.100-preview20241123 + 3.5.100-preview20241124 readme.md diff --git a/FreeSql/Extensions/EntityUtilExtensions.cs b/FreeSql/Extensions/EntityUtilExtensions.cs index d4635e39b..7925fe2c6 100644 --- a/FreeSql/Extensions/EntityUtilExtensions.cs +++ b/FreeSql/Extensions/EntityUtilExtensions.cs @@ -253,9 +253,9 @@ namespace FreeSql.Extensions.EntityUtil ) }); exps.AddRange(new Expression[] { - Expression.Return(returnTarget, var2Ret), - Expression.Label(returnTarget, Expression.Default(typeof(object))) - }); + Expression.Return(returnTarget, var2Ret), + Expression.Label(returnTarget, Expression.Default(typeof(object))) + }); return Expression.Lambda>(Expression.Block(new[] { var1Parm, var2Ret }, exps), new[] { parm1 }).Compile(); }); return func(entity); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index cb1addf59..4ccbbef74 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1087,6 +1087,93 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 获取类型构建器,可作为要构建的Type来引用 + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + Emit动态创建出Class - Type,不附带获取TableInfo + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 "" @@ -1660,104 +1747,6 @@ - - - 指定事务对象 - - - - - 原生sql语法条件,Where("id = @id", new { id = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - true 时生效 - sql语法条件 - 参数 - - - - - 传入实体,将主键作为条件 - - 实体 - - - - - 传入实体集合,将主键作为条件 - - 实体集合 - - - - - 传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - 是否标识为NOT - - - - - 动态过滤条件 - - - - - - - 禁用全局过滤功能,不传参数时将禁用所有 - - 零个或多个过滤器名字 - - - - - 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; - - - - - - - 设置表名 - - - - - - - 动态Type,在使用 Delete<object> 后使用本方法,指定实体类型 - - - - - - - 返回即将执行的SQL语句 - - - - - - 执行SQL语句,返回影响的行数 - - - - - - 执行SQL语句,返回被删除的记录 - 注意:此方法只有 Postgresql/SqlServer/Maridb/Firebird/人大金仓 有效果 - - - - - - 指定事务对象 - - - - 指定事务对象 @@ -4303,7 +4292,105 @@ 同步实体类型到数据库(指定表名) 注意:生产环境中谨慎使用 - + 实体类型 + 指定表名对比 + 强制同步结构,无视缓存每次都同步 + + + + 根据 System.Type 获取数据库信息 + + + + + + + FreeSql FluentApi 配置实体,方法名与特性相同 + + + + + + + + FreeSql FluentApi 配置实体,方法名与特性相同 + + + + + + + + 获取 FreeSql FluentApi 配置实体的元数据 + + + 未使用ConfigEntity配置时,返回null + + + + 获取实体类核心配置 + + + + + + + 获取所有数据库 + + + + + + 获取指定数据库的表信息,包括表、列详情、主键、唯一键、索引、外键、备注 + + + + + + + 获取指定单表信息,包括列详情、主键、唯一键、索引、备注 + + 表名,如:dbo.table1 + 是否忽略大小写 + + + + + 判断表是否存在 + + 表名,如:dbo.table1 + 是否忽略大小写 + + + + + 获取数据库枚举类型int值 + + + + + + + 获取c#转换,(int)、(long) + + + + + + + 获取c#值 + + + + + + + 获取c#类型,int、long + + + + + 获取c#类型对象 @@ -5810,6 +5897,28 @@ 对象池 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and @@ -6376,126 +6485,3 @@ - - - - - 插入数据,传入实体集合 - - - - - - - - 插入数据,传入实体集合 - - - - - - - - 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: - MySql 5.6+: on duplicate key update - PostgreSQL 9.4+: on conflict do update - SqlServer 2008+: merge into - Oracle 11+: merge into - Sqlite: replace into - DuckDB: on conflict do update - 达梦: merge into - 人大金仓:on conflict do update - 神通:merge into - MsAccess:不支持 - 注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性) - - - - - - - 修改数据 - - - - - - - 修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 查询数据 - - - - - - - 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 删除数据 - - - - - - - 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - 事务体 () => {} - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - - 事务体 () => {} - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - -