From fbbd74f54c6172e5c6337fa96ce2212d53163d95 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 6 Jan 2020 19:36:30 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=AE=8C=E5=96=84=20[Column(ServerTime=20?= =?UTF-8?q?=3D=20Utc)]=20=E7=89=B9=E6=80=A7=EF=BC=8C=E5=AF=B9=20Update=20?= =?UTF-8?q?=E6=97=B6=E4=B9=9F=E8=83=BD=E7=94=9F=E6=95=88=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySqlConnector/MySqlCodeFirstTest.cs | 7 +- .../MsAccess/MsAccessCodeFirstTest.cs | 5 +- .../FreeSql.Tests/MySql/MySqlCodeFirstTest.cs | 5 +- .../Oracle/OracleCodeFirstTest.cs | 5 +- .../PostgreSQL/PostgreSQLCodeFirstTest.cs | 5 +- .../SqlServer/SqlServerCodeFirstTest.cs | 5 +- .../Sqlite/SqliteCodeFirstTest.cs | 5 +- FreeSql.Tests/FreeSql.Tests/UnitTest3.cs | 5 +- .../Internal/CommonProvider/UpdateProvider.cs | 73 ++++++++++++------- FreeSql/Internal/Model/ColumnInfo.cs | 1 + FreeSql/Internal/UtilsExpressionTree.cs | 3 +- 11 files changed, 82 insertions(+), 37 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs index a4a29bea..2895bf7f 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs @@ -28,6 +28,8 @@ namespace FreeSql.Tests.MySqlConnector Assert.NotNull(item2); Assert.Equal(item.编号, item2.编号); Assert.Equal(item.标题, item2.标题); + + g.mysql.Update<测试中文表2>().SetSource(item2).ExecuteAffrows(); } class 测试中文表2 { @@ -36,8 +38,11 @@ namespace FreeSql.Tests.MySqlConnector public string 标题 { get; set; } - [Column(ServerTime = DateTimeKind.Local)] + [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] public DateTime 创建时间 { get; set; } + + [Column(ServerTime = DateTimeKind.Local)] + public DateTime 更新时间 { get; set; } } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessCodeFirstTest.cs index 1ce9d88a..4f3506f1 100644 --- a/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/MsAccessCodeFirstTest.cs @@ -36,8 +36,11 @@ namespace FreeSql.Tests.MsAccess public string 标题 { get; set; } - [Column(ServerTime = DateTimeKind.Local)] + [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] public DateTime 创建时间 { get; set; } + + [Column(ServerTime = DateTimeKind.Local)] + public DateTime 更新时间 { get; set; } } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs index 6a0da303..193d27ee 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs @@ -32,9 +32,12 @@ namespace FreeSql.Tests.MySql public string 标题 { get; protected set; } - [Column(ServerTime = DateTimeKind.Local)] + [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] public DateTime 创建时间 { get; protected set; } + [Column(ServerTime = DateTimeKind.Local)] + public DateTime 更新时间 { get; set; } + public static 测试中文表2 Create(string title, DateTime ctm) { return new 测试中文表2 { 标题 = title, 创建时间 = ctm }; diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs index ca92ea08..d1ae51d2 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs @@ -36,8 +36,11 @@ namespace FreeSql.Tests.Oracle public string 标题 { get; set; } - [Column(ServerTime = DateTimeKind.Local)] + [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] public DateTime 创建时间 { get; set; } + + [Column(ServerTime = DateTimeKind.Local)] + public DateTime 更新时间 { get; set; } } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs index f16ed691..c2a92151 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs @@ -43,8 +43,11 @@ namespace FreeSql.Tests.PostgreSQL public string 标题 { get; set; } - [Column(ServerTime = DateTimeKind.Local)] + [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] public DateTime 创建时间 { get; set; } + + [Column(ServerTime = DateTimeKind.Local)] + public DateTime 更新时间 { get; set; } } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs index 722b421c..2566b4ec 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs @@ -37,8 +37,11 @@ namespace FreeSql.Tests.SqlServer public string 标题 { get; set; } - [Column(ServerTime = DateTimeKind.Local)] + [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] public DateTime 创建时间 { get; set; } + + [Column(ServerTime = DateTimeKind.Local)] + public DateTime 更新时间 { get; set; } } diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs index f3195f9b..fb9e02ec 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs @@ -36,8 +36,11 @@ namespace FreeSql.Tests.Sqlite public string 标题 { get; set; } - [Column(ServerTime = DateTimeKind.Local)] + [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] public DateTime 创建时间 { get; set; } + + [Column(ServerTime = DateTimeKind.Local)] + public DateTime 更新时间 { get; set; } } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs index 8953057a..4f3cd9f9 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs @@ -121,8 +121,11 @@ namespace FreeSql.Tests public byte[] Binary { get; set; } + [Column(ServerTime = DateTimeKind.Utc, CanUpdate = false)] + public DateTime 鍒涘缓鏃堕棿 { get; set; } + [Column(ServerTime = DateTimeKind.Utc)] - public DateTime CreateTime { get; set; } + public DateTime 鏇存柊鏃堕棿 { get; set; } [Column(InsertValueSql = "'123'")] public string InsertValue2 { get; set; } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index a38e6d0f..ceb83026 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -557,13 +557,19 @@ namespace FreeSql.Internal.CommonProvider { if (colidx > 0) sb.Append(", "); sb.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = "); - var val = col.GetMapValue(_source.First()); - if (_noneParameter) - sb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, val)); + + if (col.Attribute.CanUpdate && string.IsNullOrEmpty(col.DbUpdateValue) == false) + sb.Append(col.DbUpdateValue); else { - sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}"))); - _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); + var val = col.GetMapValue(_source.First()); + if (_noneParameter) + sb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, val)); + else + { + sb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}"))); + _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); + } } ++colidx; } @@ -589,32 +595,36 @@ namespace FreeSql.Internal.CommonProvider if (colidx > 0) sb.Append(", "); sb.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = "); - var nulls = 0; - var cwsb = new StringBuilder().Append(cw); - foreach (var d in _source) - { - cwsb.Append(" \r\nWHEN "); - ToSqlWhen(cwsb, _table.Primarys, d); - cwsb.Append(" THEN "); - var val = col.GetMapValue(d); - if (_noneParameter) - cwsb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, val)); - else - { - cwsb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}"))); - _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); - } - if (val == null || val == DBNull.Value) nulls++; - } - cwsb.Append(" END"); - if (nulls == _source.Count) sb.Append("NULL"); + if (col.Attribute.CanUpdate && string.IsNullOrEmpty(col.DbUpdateValue) == false) + sb.Append(col.DbUpdateValue); else { - ToSqlCaseWhenEnd(cwsb, col); - sb.Append(cwsb.ToString()); + var nulls = 0; + var cwsb = new StringBuilder().Append(cw); + foreach (var d in _source) + { + cwsb.Append(" \r\nWHEN "); + ToSqlWhen(cwsb, _table.Primarys, d); + cwsb.Append(" THEN "); + var val = col.GetMapValue(d); + if (_noneParameter) + cwsb.Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, col.Attribute.MapType, val)); + else + { + cwsb.Append(_commonUtils.QuoteWriteParamter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}"))); + _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); + } + if (val == null || val == DBNull.Value) nulls++; + } + cwsb.Append(" END"); + if (nulls == _source.Count) sb.Append("NULL"); + else + { + ToSqlCaseWhenEnd(cwsb, col); + sb.Append(cwsb.ToString()); + } + cwsb.Clear(); } - cwsb.Clear(); - ++colidx; } } @@ -626,6 +636,13 @@ namespace FreeSql.Internal.CommonProvider if (_setIncr.Length > 0) sb.Append(_set.Length > 0 ? _setIncr.ToString() : _setIncr.ToString().Substring(2)); + if (_source.Any() == false) + { + foreach (var col in _table.Columns.Values) + if (col.Attribute.CanUpdate && string.IsNullOrEmpty(col.DbUpdateValue) == false) + sb.Append(", ").Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = ").Append(col.DbUpdateValue); + } + if (_table.VersionColumn != null) { var vcname = _commonUtils.QuoteSqlName(_table.VersionColumn.Attribute.Name); diff --git a/FreeSql/Internal/Model/ColumnInfo.cs b/FreeSql/Internal/Model/ColumnInfo.cs index 05dc24a2..ef164b67 100644 --- a/FreeSql/Internal/Model/ColumnInfo.cs +++ b/FreeSql/Internal/Model/ColumnInfo.cs @@ -16,6 +16,7 @@ namespace FreeSql.Internal.Model public string DbTypeText { get; internal set; } public string DbDefaultValue { get; internal set; } public string DbInsertValue { get; internal set; } + public string DbUpdateValue { get; internal set; } public int DbSize { get; internal set; } public byte DbPrecision { get; internal set; } public byte DbScale { get; internal set; } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index b35b342f..46aafb3e 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -188,8 +188,9 @@ namespace FreeSql.Internal //} if (colattr.ServerTime != DateTimeKind.Unspecified && new[] { typeof(DateTime), typeof(DateTimeOffset) }.Contains(colattr.MapType.NullableTypeOrThis())) { - col.DbDefaultValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc; + col.DbDefaultValue = "'1970-1-1'"; col.DbInsertValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc; + col.DbUpdateValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc; } if (string.IsNullOrEmpty(colattr.InsertValueSql) == false) {