Skip to content

Releases: dotnetcore/FreeSql

v0.11.23

20 Nov 10:37
Compare
Choose a tag to compare
  • 增加 ExpressionCallAttribute 特性,实现表达式函数自定义解析;wiki
  • 增加 IncludeMany 贪婪加载的时候可指定子表的字段,避免查询子表所有字段;
  • 增加 DbContext、Repository SaveManyToMany 方法,实现手工保存 ManyToMany 关联数据;wiki
  • 增加 IFreeSql.GlobalFilter 全局过滤器,wiki
  • 增加 AsTable 和 Repository 分表时的自动迁移分表功能;
  • 增加 ICodeFirst.SyncStructure(Type entityType, string tableName) 指定表名来迁移实体;
fsql.CodeFirst.SyncStructure(typeof(Log), "Log_1"); //迁移到 Log_1 表
fsql.CodeFirst.SyncStructure(typeof(Log), "Log_2"); //迁移到 Log_2 表
  • 增加 ISelect ToDelete/ToUpdate 方法,实现更复杂的删除/更新操作,wiki
  • 增加 SqlServer ISelect.WithLock 扩展方法,实现 with(nolock) 查询;
  • 增加 SqlServer IFreeSql.SetGlobalSelectWithLock 扩展方法,实现全局设置 with(nolock) 查询;
  • 增加 FreeSql.DbContext DbSet Remove 可根据 lambda 条件删除数据的方法;
  • 增加 FreeSql.Provider.Sqlite 对 Xamarin 环境下的适配;
  • 增加 MySql 特有功能 Insert Ignore Into;wiki
  • 增加 MySql 特有功能 On Duplicate Key Update 功能,wiki
  • 增加 PostgreSQL 特有功能 On Conflict Do Update 功能,wiki
  • 兼容 SqlServer nvarchar/varchar 表达式解析,分别解析为:N'' 和 '',优化索引执行计划;
  • 优化 Contains 表达式解析为 where in 自动拆分,防止大于 1000 的 SQL 错误,如下:
var arr = Enumerable.Range(1, 1333).ToArray();
var sql = fsql.Select<T>().Where(a => arr.Contains(a.Int)).ToList();
//原来:where id in (1..1333)
//现在:where id in (1..500) or id in (501..1000) or id in (1001..1333)
  • 优化 FreeSql.DbContext 构造方法,方便注入使用;

  • 优化 Aop.AuditValue 审计过的值,IUpdate.UpdateColumns 即使不指定该列也会更新;

  • 优化 ManyToMany 中间表不需要指明 [Column(IsPrimary = true)] 特性;

  • 优化 实体类重写属性 new 如果类型与基类不一致,无法使用的问题;

  • 完善 SqlServer2005 环境跑通了所有单元测试;

  • 完善 所有参数化 object parms 可使用 IDictionary 类型传入;

  • 完善 ToList Dto 映射查询的规则;wiki


  • 修复 Where(a => bool && id > 0) bool 未解析正确的 bug;

(之前大多数类似的表达都能解析,这次是一个特殊情况)

  • 修复 BaseRepository 析构时与工作单元的回滚逻辑 bug;#131
  • 修复 FreeSql.DbContext 析构方法的 bug,错误的回滚了外部 UnitOfWork;
  • 修复 MapType 属性的表达式解析 数组.Contains 得到是映射之前的值 bug;
  • 修复 MapType 属性 与 IncludeMany 变异功能未映射处理的 bug;
  • 修复 IsNulable 特性不生效的 bug;
  • 修复 SqlServer DbFirst、CodeFirst 查询实体表的列信息错误,当设置了表/列多个扩展属性时发生;
  • 修复 SqlServer2005 CodeFirst 迁移时,不支持 SET (LOCK_ESCALATION TABLE) 的错误(已做适配);
  • 修复 SqlServer2005 批量插入SQL语法错误,不支持 Values(),()(已做适配);
  • 修复 ReadAnonymous 读取数据设置只读属性的错误;#132
  • 修复 ISelect .From 方法之前使用 .Include 方法,导致生成的多表 JOIN 位置错误的 bug;

  • 移除 IUpdate/IDelete WhereExists 方法;
  • 移除 TableAttribute.SelectFilter 功能;

v0.10.15 (.Net Framework 4.0)

23 Oct 04:43
Compare
Choose a tag to compare
  • 增加 .Net Framework 4.0 的支持,出于环境考虑 .Net Framework 4.0 不支持异步方法;
  • 增加 IndexAttribute 特性,自动迁移索引,以及对应的 FluentApi 方法;
  • 增加 NavigateAttribute 特性对应的 Fluent 功能;#96
  • 增加 ColumnAttribute 可插入(CanInsert)、可更新(CanUpdate);#99
  • 增加 IFreeSql.Insert<T>(List source) 方法;
  • 增加 Aop.ConfigEntity 属性 ModifyIndexResult 现实 IndexAttribute 的设置;
  • 增加 PostgreSQL 的 Odbc 访问提供,相比 FreeSql.Provider.PostgreSQL 支持的类型更少;
  • 增加 通用的 Odbc 访问提供,不能迁移实体到数据库,不能 Skip 这样来分页,理论上能 crud 所有 odbc 数据库;
  • 增加 DbContext/Repository ManyToMany联级保存功能(之前已支持OneToMany);

文档: https://github.com/2881099/FreeSql/wiki/%e8%81%94%e7%ba%a7%e4%bf%9d%e5%ad%98

  • 增加 FreeSql.DbContext 实体对象的变化事件;

文档: https://github.com/2881099/FreeSql/wiki/DbContext#%E5%AE%9E%E4%BD%93%E5%8F%98%E5%8C%96%E4%BA%8B%E4%BB%B6

  • 增加 List<T1> 扩展方法 IncludeMany,实现从已知的内存 List 数据,进行和 ISelect.IncludeMany 相同功能的贪婪加载;

示例:new List<Song>(new[] { song1, song2, song3 }).IncludeMany(g.sqlite, a => a.Tags);
文档:https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd#%E5%AF%BC%E8%88%AA%E5%B1%9E%E6%80%A7-onetomanymanytomany


  • 优化 FreeSqlBuilder 处理 MaxLength 特性的容器处理;
  • 优化 枚举属性的默认值容错,枚举下标不存在 0 的时候,mysql 迁移结构默认值报错;
  • 优化 ORACLE Command 绑定变量 BindByName = true;#107
  • 优化 IUpdate.IgnoreColumns/UpdateColumns 可对属性名,或字段名做设置;#95
  • 优化 忽略 List<T> 作为 Curd 类型操作;
  • 补充 Aop.CurdBefore 事件参数 Table 实体类型的元数据;

  • 修复 Pgsql string[] 属性表达式 Contains 缺少类型转换的 SQL 语法错误;
  • 修复 postgresql 12 移除 pg_attrdef.adsrc 列,导致 CodeFirst 方法失败的 bug;
  • 修复 PostgreSQL DbFirst 获取字段类型的时候,没有拼得字符串的长度(如 varchar(255));
  • 修复 DbFirst 当表数量过大时(如 oracle 表数量大于 1000),可能报错的 bug;
  • 修复 FreeSql.DbContext/FreeSql.Repository 当主键为 Guid? 可空类型时,发生参数错误;

System.ArgumentException:“Expression of type 'System.Guid' cannot be used for assignment to type 'System.Nullable`1[System.Guid]'”


  • 移除 ColumnAttribute.Unique 属性设置,改为 IndexAttribute 特性设置唯一键;

v0.9.18(ODBC)

20 Sep 16:53
Compare
Choose a tag to compare
  • 增加 FreeSql.Provider.Odbc,实现 Oracle/SqlServer/MySql/PostgreSQL 的 Odbc 专用访问提供;
  • 增加 通用的 Odbc 访问提供,理论上能 crud 所有 odbc 数据库;
  • 增加 FreeSql.Extensions.JsonMap 扩展包,实现快速将对象映射为json字符串的方法;
fsql.UseJsonMap(); //开启功能

class TestConfig
{
    public int clicks { get; set; }
    public string title { get; set; }
}
[Table(Name = "sysconfig")]
public class S_SysConfig<T>
{
    [Column(IsPrimary = true)]
    public string Name { get; set; }

    [JsonMap]
    public T Config { get; set; }
}
  • 增加 MaxLength 特性的解析,实体字符串长度设置;
class Topic {
    [MaxLength(128)]
    public string Title { get; set; }
}
  • 增加 BaseRepository.AttachOnlyPrimary 方法,只附加实体的主键值;

在更新前使用可实现不查询数据库再更新、也可以实现更新时不更新值为 null 的字段

class T {
    public int id { get; set; }
    public string name { get; set; }
    public string other { get; set; }
}
var item = new T { id = 1, name = "xx" };
fsql.GetRepository<T>().AttachOnlyPrimary(item).Update(item); //只更新 name
  • 增加 FreeSqlBuilder.UseConnectionString 参数 providerType,可解决因包版本冲突时,可能无法反射获得 FreeSql.Provider 对应的类型,通常这个参数不需要设置;

  • 增加 创建表时指定字段位置,如:[Column(Position = 1],可为负数即反方向位置;

  • 增加 ISelect.ToChunk 实现分块查询数据,减少数据过大时内存占用;

  • 增加 AsTable 多次,可查询分表后的多个子表记录,以 UNION ALL 形式执行;

  • 增加 ISelect.First() 方法;

  • 优化 MaxLength 特性,当指定为 -1 时 DbType 会分别映射类型 text/nvarchar(max)/nvarchar2(4000);

  • 优化 表达式解析未实现的错误提醒,如 $"";

  • 优化 AsTable UseSyncStructureToLower/ToUpper 设置,兼容 AsTable((t,o) => "(select * from tb)");

  • 优化 ISelect`1.Include之后ToList参数includeNestedMembers默认为true;

  • 优化 MapType DateTime/DateTimeOffset 类型转换互通;


  • 移除 FreeSql.Repository 扩展方法 FromRepository;

  • 修复 批量更新 bug,当某行某字段值为null,其他行的该字段也更新成了null;【重大 bug】
  • 修复 Lambda 表达式中 DateTime.Now.ToString("yyyyMMdd") 不能直接执行的 bug;
  • 修复 属性无set自动忽略的bug;
  • 修复 导航属性配置,循环关系的情况下可能导致的 bug;
  • 修复 导航属性配置和Aop冲突的 bug;
  • 修复 Aop.AuditValue 与 FreeSql.Repository 主键状态管理的冲突;
  • 修复 MapType 表达式解析时的层级 bug,可能出现 ExpressionTree 类型错误;

v0.8.11

25 Aug 10:26
Compare
Choose a tag to compare
  • 增加 Aop.AuditValue 事件,在插入/更新数据时审计属性值,wiki
  • 优化 导航属性的关系,友好支持 int/int? 映射;
  • 优化 DbContext/Repository 局部调整;
  • 优化 DbContext/Repository 局部调整;
  • 补充 使用 IsIgnore 忽略后,表达式再使用时的友好错误提示;

  • 修复 Pgsql 批量更新使用 NoneParameter 后日期类型的语法 bug;
  • 修复 Oracle DbFirst 大小写问题没正确获取列对应 CsType 值的 bug;
  • 修复 IncludeMany 变异 Where 指定的属性类型不一致的 bug;(如 int 和 int?)
  • 修复 导航关系多属性时的错序 bug;
  • 修复 延时属性的类,没有设置Namespace时的 bug;
  • 修复 DbContext.Save 只查询不更新的bug;

v0.8.5

13 Aug 02:55
Compare
Choose a tag to compare
  • 增加 FreeSql.Provider.Oracle 下的 OraclePrimaryKeyName 特性,手工设置主键名防止默认名过长问题;

  • 增加 IFreeSql.Select`T1...T10 的多表查询扩展方法;

  • 增加 表达式函数 string.IsNullOrWhiteSpace 解析;

  • 增加 UnitOfWork.Current 静态属性,AsyncLocal 实现 [NETStandard 2.0];

  • 增加 ISelect.WhereCascade 实现多表查询时,向每个表中附加条件; wiki

  • 增加 表达式对基类转换的解析,如:Where(a => (a as BaseEntity).IsDeleted == true);

  • 增加 Examples 项目 base_entity,利用 BaseEntity 实现简洁的数据库操作;

  • 增加 子查询判断,如果使用了相同 ISelect 会死循环;

  • 增加 连接字符串错误时的友好提示;

  • 增加 子查询函数 First、Count、Min、Max、Sum、Avg 的支持 #wiki

  • 优化 内部实体管理的默认值,防止导航属性使用抽象类/接口时出现错误;

  • 优化 表达式中不能使用 c# 函数的问题,

如:where(a => HttpContext.Session.GetString("UserID") == a.UserId)

  • 优化 IUpdate.Set 表达式传入匿名类更新多个字段;
  • 优化 IInsert.InsertIdentity 可插入自增属性;
  • 优化 ExpressionTree 类型转换的友好错误提示;
  • 补充 ISelect`T1...T10 LeftJoin/InnerJoin/RightJoin 多参数方法;
  • 补充 Navigate(ManyToMany = typeof(中间表)) 多对多自定义配置;
  • 补充 Oracle DbFirst raw 等类型映射处理,其他未处理的类型将映射为 string;

  • 修复 ISelect.WhereCascade 当内部使用 (a as BaseEntity).TenantId 时报错的 bug;
  • 修复 ISelect Sum/First 子查询时,若子查询实体类与主查询一样时,导致的 bug;
  • 修复 IUpdate.Set 表达式传入匿名类更新多个字段,后表达式未加[]或""的 bug;
  • 修复 Aop.ConfigEntityProperty 操作导航属性后,执行 insert 语句认为它也是字段的 bug;
  • 修复 查询重复数据时使用 IncludeMany 出现字典重复添加的 bug;(如一对多使用LeftJoin查询,主实体查询出了重复的数据)
  • 修复 Oracle 表达式 DateTime.Subtract(DateTime) 解析 bug;
  • 修复 Oracle CodeFirst 使用 OldName 迁移自增字段时,未删除旧的触发器和序列的 bug;
  • 修复 CodeFirst 迁移代码注释到数据库,继承的基类未生效的 bug;
  • 修复 SqlServer IUpdate.ExecuteUpdated 拼接SQL bug;
  • 修复 .From 多表查询别名的匹配 bug;
  • 修复 SqlServer 未处理字符串前面加N 的 bug;
  • 修复 LambadaExpressionExtensions 扩展方法 And/Or 当存在二级 lambada 时替换错误的 bug;

如:where.Add(a => a.Tags.Any(b => ...)),b 替换错误

v0.7.6

04 Jul 11:52
Compare
Choose a tag to compare

v0.7.6

  • 增加 IGroupSelect ToSql(string) 重载方法;
  • 优化 表达式 true && ... 解析的处理;
  • 优化 Navigate 指定联合键关系时,对属性顺序的要求,当类型不一样、名称一样时无须指明属性的顺序,如:[Navigate("MemberId, ShopId")];

  • 修复 Insert/Update 大批量操作分批执行时,如果外部使用了 Ado.Transaction,没有使用线程事务对象,而是创建了新事务的 bug;
  • 修复 Insert ClearData 重复利用的 bug(使用 IgnoreColumns 进行大批量插入时会发生);
  • 修复 ISelect.From<T2, T2> 当传入相同的两个实体类型,可能导致内部 Join 无法匹配的 bug;
  • 修复 根据代码注释,迁移到数据库备注,当实体类属于 .exe 程序集时的 bug:System.Xml.XmlException:“根级别上的数据无效。 第 1 行,位置 1。”

v0.7.1

26 Jun 16:18
Compare
Choose a tag to compare
  • 增加 表达式 .HasValue 和 !.HasValue 的解析支持;
  • 增加 表达式 DateTime - DateTime 和 DateTime - TimeSpan 的解析支持;
  • 增加 LambdaExpression 扩展方法 And/Or/Not 快速拼接表达式;
  • 增加 CodeFirst 根据代码注释,迁移到数据库备注(需要实体类所在项目开启xml生成功能);
  • 合并 FreeSql.DbContext 项目至 FreeSql;
  • 优化 IUpdate.Set 支持 Set(a => new { Clicks = a.Clicks + 1, Time = DateTime.Now }) 指定多个字段更新的用法;

  • 修复 .From.GroupBy Item2 以上元组参数未查找到的 bug #63
  • 修复 IUpdate.Set 表达式解析的 bug;

v0.6.10

14 Jun 03:20
Compare
Choose a tag to compare

v0.6.10

  • 增加 TableAttribute 特性属性 DisableSyncStructure,当实体对应的是视图时,可使用本功能禁用迁移;
  • 增加 FreeSqlBuilder UseEntityPropertyNameConvert() 全局转换实体属性名方法 #60

v0.6.9

  • 修复 批量插入/更新大量数据时,未使用NoneParameter,会导致部分未执行的bug;

v0.6.8

  • 处理 非正常 Provider GC 可能为 null 的错误;
  • 修复 Aop.ParseExpression 使用 FreeParse 方法死循环的 bug;
  • 增加 ISelect.OrderBy 重载,与 WhereIf 相同行为;

v0.6.6

  • 适配 FreeSql.Provider.MySqlConnector,和它对应的266个单元测试;

v0.6.5

  • 增加 NavigateAttribute 配置导航关系;
  • 修复 LinqToSql 方法,开启自动迁移时,迁移了无关类的 bug;
  • 修复 Oracle DbFirst date(7) 类型未处理的 bug;
  • 修复 AsSelect().Any() 未给其他条件时,产生 null bug;
  • 修复 子查询使用非表达式方法时,参数无效的 bug;
  • 增加 FreeSql.Extensions.LazyLoading 对 .net 4.5 的支持;
  • 优化 MySql CodeFirst 增加 DateTime 迁移后,默认值为 0000-00-00 导致读取失败的 bug;
  • 优化 LazyLoading 友好错误提示;

v0.6.3

  • 补充 当初始化 ConnectionString 参数为空时,给出友好错误提示;
  • 修复 IUpdate.IngoreColumns/UpdateColumns 若实体指定别名后,可能无效的bug;

v0.6.2

  • 增加 FreeSql.Provider.MySqlConnector 实现包;
  • 修复 mysql CodeFirst enum/set 小写时,对 MySqlConnector 不友好的 bug;

v0.6.1(拆解 FreeSql)

  • 各数据库单独包、延时加载包;
  • FreeSql.Extensions.LazyLoading
  • FreeSql.Provider.MySql
  • FreeSql.Provider.PostgreSQL
  • FreeSql.Provider.SqlServer
  • FreeSql.Provider.Sqlite
  • FreeSql.Provider.Oracle
  • 移除 IFreeSql.Cache,以及 ISelect.Caching 方法;
  • 移除 IFreeSql.Log,包括内部原有的日志输出,改为 Trace.WriteLine;
  • IAdo.Query<dynamic> 读取返回变为 List<Dictionary<string, object>>;
  • 定义 IFreeSql 和以前一样,移除了 UseCache、UseLogger 方法;

v0.5.23

28 May 11:57
Compare
Choose a tag to compare

v0.5.23

  • 补充 IUpdate.Set(a => a.Click == 10),简化 Set 更新单个字段表达式;
  • 优化 延时导航属性的错误提醒,当无法匹配错误,转到重写类 get 时抛出(实现延时导航属性,与普通导航一起使用);
  • 优化 ICodeFirst.SyncStructure 错误提示,当使用不可迁移实体时;
  • 优化 实体数据属性 DbDefaultValue 处理;
  • 修复 Expression 表达式解析 Convert 的判断 bug;

v0.5.21

  • 修复 IncludeMany ManyToMany,若中间表未使用 延时加载 属性功能时,出现的 bug;
  • 增加 IncludeMany Take(5) 功能,实现每个子集合只取5条记录;

v0.5.18

14 May 01:35
Compare
Choose a tag to compare

v0.5.18

  • 增加 ISelect.Include 贪婪加载第一版,已通过集合的导航数据加载,包括 OneToMany/ManyToMany;
  • 修改 IncludeMany ManyToMany ET 缓存的 bug;
  • 完善 IncludeMany 联合键处理;
  • 完善 Include/IncludeMany 单元测试;
  • 修复 Include 延时加载 ManyToOne/OneToOne,当值为 null 时,仍然会查询一次数据;
  • 修改 Query/ToList 混合使用时,可能导致的 ET 缓存 bug;
  • 修改 Query 查询的实体设置了 IsIgnore 时,可能出现 ET 读取位置偏移 bug;
  • 增加 变异的 IncludeMany,即使不是导航属性,也可以贪婪加载,Wiki

v0.5.12

  • 优化 连接预热策略:min pool size 不设置或 <= 0,则默认预热 5个;也可以设置 1;
  • 取消 MySql CodeFirst 对表字符集的设置;
  • 增加 ToList() 方法,作用与 ToList(a => new Dto()) 相同;