From 8d92ccd7510fc8d4787a0065fad9937d0d11103c Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Wed, 18 Sep 2019 16:58:13 +0800 Subject: [PATCH] ## v0.9.16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加 BaseRepository.AttachOnlyPrimary 方法,只附加实体的主键值; > 在更新前使用可实现不查询数据库再更新、也可以实现更新时不更新值为 null 的字段 ```csharp 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().AttachOnlyPrimary(item).Update(item); //只更新 name ``` - 修复 Lambda 表达式中 DateTime.Now.ToString("yyyyMMdd") 不能直接执行的 bug; --- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- FreeSql.DbContext/DbContext/DbContext.cs | 11 +++++++++++ FreeSql.DbContext/DbSet/DbSet.cs | 17 +++++++++++++++++ FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.xml | 19 +++++++++++++++++++ .../Repository/Repository/BaseRepository.cs | 5 +++++ .../Repository/Repository/IBasicRepository.cs | 6 ++++++ FreeSql.Repository/FreeSql.Repository.csproj | 2 +- .../RepositoryTests.cs | 6 +++++- FreeSql.Tests/FreeSql.Tests/UnitTest1.cs | 8 +++++++- FreeSql/FreeSql.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySql/MySqlExpression.cs | 4 ++-- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../OracleExpression.cs | 4 ++-- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../PostgreSQLExpression.cs | 4 ++-- .../FreeSql.Provider.SqlServer.csproj | 2 +- .../SqlServerExpression.cs | 4 ++-- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../SqliteExpression.cs | 4 ++-- 24 files changed, 92 insertions(+), 24 deletions(-) diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index d3a4a065..2438312c 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.9.15 + 0.9.16 true YeXiangQin BaseEntity 是一种极简单的 CodeFirst 开发方式,特别对单表或多表CRUD,利用继承节省了每个实体类的重复属性(创建时间、ID等字段),软件删除等功能,进行 crud 操作时不必时常考虑仓储的使用. diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index af962199..16674c11 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql 扩展包,可实现实体类属性为对象时,以JSON形式映射存储. diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 0b738253..7b64f524 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql 扩展包,可实现【延时加载】属性. diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index 364326eb..0d0fcc75 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -129,6 +129,17 @@ namespace FreeSql /// public void Attach(TEntity data) where TEntity : class => this.Set().Attach(data); public void AttachRange(IEnumerable data) where TEntity : class => this.Set().AttachRange(data); + + /// + /// 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 + /// + /// + /// + public DbContext AttachOnlyPrimary(TEntity data) where TEntity : class + { + this.Set().AttachOnlyPrimary(data); + return this; + } #endregion #region Queue Action diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index 32c69096..7795ba50 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -162,6 +162,23 @@ namespace FreeSql }); } } + /// + /// 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 + /// + /// + public DbSet AttachOnlyPrimary(TEntity data) + { + if (data == null) return this; + var pkitem = (TEntity)Activator.CreateInstance(_entityType); + foreach (var pk in _db.Orm.CodeFirst.GetTableByEntity(_entityType).Primarys) + { + var colVal = _db.Orm.GetEntityValueWithPropertyName(_entityType, data, pk.CsName); + _db.Orm.SetEntityValueWithPropertyName(_entityType, pkitem, pk.CsName, colVal); + } + this.Attach(pkitem); + return this; + } + /// /// 清空状态数据 /// diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 83634ba5..b7cf2d84 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index e0d4588c..42dd9adc 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -39,6 +39,13 @@ + + + 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 + + + + 是否开启一对多,联级保存功能 @@ -57,6 +64,12 @@ + + + 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 + + + 清空状态数据 @@ -156,6 +169,12 @@ + + + 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 + + + 是否启用工作单元 diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index e2f38254..2fbcc0cc 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -140,6 +140,11 @@ namespace FreeSql public void Attach(TEntity data) => _db.Attach(data); public void Attach(IEnumerable data) => _db.AttachRange(data); + public IBasicRepository AttachOnlyPrimary(TEntity data) + { + _db.AttachOnlyPrimary(data); + return this; + } public void FlushState() => _dbset.FlushState(); public TEntity InsertOrUpdate(TEntity entity) diff --git a/FreeSql.DbContext/Repository/Repository/IBasicRepository.cs b/FreeSql.DbContext/Repository/Repository/IBasicRepository.cs index 21aecb89..5f2ba98a 100644 --- a/FreeSql.DbContext/Repository/Repository/IBasicRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IBasicRepository.cs @@ -21,6 +21,12 @@ namespace FreeSql /// void Attach(TEntity entity); void Attach(IEnumerable entity); + /// + /// 附加实体,并且只附加主键值,可用于不更新属性值为null或默认值的字段 + /// + /// + IBasicRepository AttachOnlyPrimary(TEntity data); + int Update(TEntity entity); int Update(IEnumerable entitys); Task UpdateAsync(TEntity entity); diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 193a211f..dab8e461 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.15 + 0.9.16 YeXiangQin FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite, and read/write separation、and split table. https://github.com/2881099/FreeSql/wiki/Repository diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs index b2be4440..95319a9c 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs @@ -37,9 +37,13 @@ namespace FreeSql.Tests repos.Attach(item); item.Title = "xxx"; - repos.Update(item); + repos.Update(item); //ִ UPDATE "AddUpdateInfo" SET "Title" = 'xxx' WHERE("Id" = '1942fb53-9700-411d-8895-ce4cecdf3257') Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(item)); + repos.Update(item); //вִ SQLδ仯 + + repos.AttachOnlyPrimary(item).Update(item); //и״ֵֵֻ̬ڣִи set title = xxx + Console.WriteLine(repos.UpdateDiy.Where(a => a.Id == item.Id).Set(a => a.Clicks + 1).ToSql()); repos.UpdateDiy.Where(a => a.Id == item.Id).Set(a => a.Clicks + 1).ExecuteAffrows(); diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index edf94e73..9aa4e531 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -22,7 +22,7 @@ namespace FreeSql.Tests { public static T TryTo(this string that) { - return default(T); + return (T)Internal.Utils.GetDataReaderValue(typeof(T), that); } public static string FormatDateTime() @@ -407,6 +407,12 @@ namespace FreeSql.Tests public void Test1() { + var testrunsql1 = g.mysql.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); + var testrunsql2 = g.pgsql.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); + var testrunsql3 = g.sqlserver.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); + var testrunsql4 = g.oracle.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); + var testrunsql5 = g.sqlite.Select().Where(a => a.OptionsEntity04 > DateTime.Now.AddDays(0).ToString("yyyyMMdd").TryTo()).ToSql(); + var testssargs1 = "10100"; var testformatsql1 = g.mysql.Select().Where(a => a.NamespaceName == $"1_{10100}").ToSql(); var testorderbysql = g.mysql.Select().OrderByDescending(a => a.OptionsEntity04 + (a.score ?? 0)).ToSql(); diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 9480b01e..48308669 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 3540a11f..ffe8dc73 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -2,7 +2,7 @@ netstandard2.0;net452 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql 数据库实现,基于 MySql 5.6 diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs index d74aa632..4bfc1a4c 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -83,7 +83,7 @@ namespace FreeSql.MySql if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; break; case "ToString": - if (callExp.Object != null) return $"cast({getExp(callExp.Object)} as char)"; + if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as char)" : null; break; } @@ -385,7 +385,7 @@ namespace FreeSql.MySql break; case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; case "CompareTo": return $"timestampdiff(microsecond,{args1},{left})"; - case "ToString": return $"date_format({left}, '%Y-%m-%d %H:%i:%s.%f')"; + case "ToString": return exp.Arguments.Count == 0 ? $"date_format({left}, '%Y-%m-%d %H:%i:%s.%f')" : null; } } return null; diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 99991aa5..c4663edc 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql 数据库实现,基于 MySql 5.6 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 12cfda8b..3d5eba25 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql 数据库实现,基于 Oracle 11 diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs index d516f0a2..139d1a6c 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -83,7 +83,7 @@ namespace FreeSql.Oracle if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value"; break; case "ToString": - if (callExp.Object != null) return $"to_char({getExp(callExp.Object)})"; + if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; break; } @@ -387,7 +387,7 @@ namespace FreeSql.Oracle break; case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; case "CompareTo": return $"extract(day from ({left}-({getExp(exp.Arguments[0])})))"; - case "ToString": return $"to_char({left},'YYYY-MM-DD HH24:MI:SS.FF6')"; + case "ToString": return exp.Arguments.Count == 0 ? $"to_char({left},'YYYY-MM-DD HH24:MI:SS.FF6')" : null; } } return null; diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 5d1fdaba..5c031066 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql 数据库实现,基于 PostgreSQL 9.5 diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs index e6c3bd02..5357d296 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs @@ -88,7 +88,7 @@ namespace FreeSql.PostgreSQL if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; break; case "ToString": - if (callExp.Object != null) return $"({getExp(callExp.Object)})::varchar"; + if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::varchar" : null; break; } @@ -496,7 +496,7 @@ namespace FreeSql.PostgreSQL break; case "Equals": return $"({left} = ({getExp(exp.Arguments[0])})::timestamp)"; case "CompareTo": return $"extract(epoch from ({left})::timestamp-({getExp(exp.Arguments[0])})::timestamp)"; - case "ToString": return $"to_char({left}, 'YYYY-MM-DD HH24:MI:SS.US')"; + case "ToString": return exp.Arguments.Count == 0 ? $"to_char({left}, 'YYYY-MM-DD HH24:MI:SS.US')" : null; } } return null; diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index b2f22df8..985769e2 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -2,7 +2,7 @@ netstandard2.0;net451 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql 数据库实现,基于 SqlServer 2005+,并根据版本适配分页方法:row_number 或 offset fetch next diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index 28b7cc4e..d5a1ccdd 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -87,7 +87,7 @@ namespace FreeSql.SqlServer if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; break; case "ToString": - if (callExp.Object != null) return callExp.Object.Type.NullableTypeOrThis() == typeof(Guid) ? $"cast({getExp(callExp.Object)} as varchar(36))" : $"cast({getExp(callExp.Object)} as nvarchar)"; + if (callExp.Object != null) return callExp.Arguments.Count == 0 ? (callExp.Object.Type.NullableTypeOrThis() == typeof(Guid) ? $"cast({getExp(callExp.Object)} as varchar(36))" : $"cast({getExp(callExp.Object)} as nvarchar)") : null; break; } @@ -367,7 +367,7 @@ namespace FreeSql.SqlServer break; case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; case "CompareTo": return $"datediff(second,{getExp(exp.Arguments[0])},{left})"; - case "ToString": return $"convert(varchar, {left}, 121)"; + case "ToString": return exp.Arguments.Count == 0 ? $"convert(varchar, {left}, 121)" : null; } } return null; diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 195b52c7..cb5d58d3 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -2,7 +2,7 @@ netstandard2.0;net45 - 0.9.15 + 0.9.16 true YeXiangQin FreeSql 数据库实现,基于 Sqlite 3.0 diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index cca89bb8..db13908e 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -83,7 +83,7 @@ namespace FreeSql.Sqlite if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; break; case "ToString": - if (callExp.Object != null) return $"cast({getExp(callExp.Object)} as character)"; + if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as character)" : null; break; } @@ -389,7 +389,7 @@ namespace FreeSql.Sqlite break; case "Equals": return $"({left} = {getExp(exp.Arguments[0])})"; case "CompareTo": return $"(strftime('%s',{left})-strftime('%s',{args1}))"; - case "ToString": return $"strftime('%Y-%m-%d %H:%M.%f',{left})"; + case "ToString": return exp.Arguments.Count == 0 ? $"strftime('%Y-%m-%d %H:%M.%f',{left})" : null; } } return null;