From e46b474456680dc00764ab650bbb1280ed09217d Mon Sep 17 00:00:00 2001 From: nsnail Date: Sat, 4 Feb 2023 15:16:14 +0800 Subject: [PATCH] =?UTF-8?q?*=20TableAttribute=20=E7=A6=81=E7=94=A8?= =?UTF-8?q?=E7=BB=A7=E6=89=BF=20*=20=E4=BF=AE=E6=94=B9package=20id=20?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E4=B8=8B=E8=BD=BD=E5=88=B0=E5=8E=9F=E7=89=88?= =?UTF-8?q?=20*=20=E5=8F=91=E5=B8=83=E5=88=B0nuget.org=20*=20xml=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E6=96=87=E4=BB=B6=20GenerateDocumentationFile=20*=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3SqlServer=E5=94=AF=E4=B8=80=E7=B4=A2=E5=BC=95?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E6=8F=92=E5=85=A5=E5=A4=9A=E4=B8=AANULL?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=20*=20Microsoft.Data.SqlClient=20?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E8=87=B3=202.1.7=20*=20=E5=AF=B9=E4=BA=8E?= =?UTF-8?q?=E5=B7=B2=E7=BB=8F=E9=85=8D=E7=BD=AE=E4=BA=86TableNameImpl?= =?UTF-8?q?=E7=9A=84=E8=A1=A8=EF=BC=8C=E4=B9=9F=E6=94=AF=E6=8C=81AsTable?= =?UTF-8?q?=E9=87=8D=E8=AE=BE=E8=A1=A8=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.csproj | 6 +- FreeSql/DataAnnotations/TableAttribute.cs | 7 ++- FreeSql/FreeSql.csproj | 5 +- .../CommonProvider/InsertOrUpdateProvider.cs | 3 +- .../Internal/CommonProvider/InsertProvider.cs | 7 ++- .../Internal/CommonProvider/UpdateProvider.cs | 9 +-- .../FreeSql.Provider.SqlServer.csproj | 10 ++- .../SqlServerCodeFirst.cs | 24 ++++++- .../FreeSql.Provider.Sqlite.csproj | 10 ++- nuget/build-and-push.ps1 | 62 +++++++++++++++++++ 10 files changed, 122 insertions(+), 21 deletions(-) create mode 100644 nuget/build-and-push.ps1 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index fae89602..fa8d9d7e 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -9,7 +9,7 @@ FreeSql ORM DbContext git MIT - $(AssemblyName) + $(AssemblyName).NS logo.png $(AssemblyName) true @@ -17,7 +17,7 @@ true key.snk false - 3.5.100-preview20240825 + 3.5.100-preview20240825-ns1 readme.md @@ -26,7 +26,7 @@ - + FreeSql.DbContext.xml 3 1701;1702;1591 diff --git a/FreeSql/DataAnnotations/TableAttribute.cs b/FreeSql/DataAnnotations/TableAttribute.cs index 683e48dc..7ff97b28 100644 --- a/FreeSql/DataAnnotations/TableAttribute.cs +++ b/FreeSql/DataAnnotations/TableAttribute.cs @@ -9,7 +9,10 @@ using System.Text.RegularExpressions; namespace FreeSql.DataAnnotations { - [AttributeUsage(AttributeTargets.Class)] + + [AttributeUsage(AttributeTargets.Class + //禁用继承 nsnail@2022年11月23日14:38:45 + , Inherited = false)] public class TableAttribute : Attribute { @@ -419,4 +422,4 @@ namespace FreeSql.DataAnnotations return this; } } -} +} \ No newline at end of file diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 17785314..f3b54c92 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -10,6 +10,7 @@ git MIT FreeSql;ORM + $(AssemblyName).NS logo.png $(AssemblyName) true @@ -17,7 +18,7 @@ true key.snk false - 3.5.100-preview20240825 + 3.5.100-preview20240825-ns1 readme.md @@ -67,7 +68,7 @@ - + FreeSql.xml 3 1701;1702;1591 diff --git a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs index c3392942..5c2f3db8 100644 --- a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs @@ -226,7 +226,8 @@ namespace FreeSql.Internal.CommonProvider if (_tableRule == null && _table.AsTableImpl == null) return _commonUtils.GetEntityTableAopName(_table, true); var tbname = _table?.DbName ?? ""; string newname = null; - if (_table.AsTableImpl != null) + // 对于已经配置了TableNameImpl的表,也支持AsTable重设表名 by nsnail@2024年8月26日11:10:22 + if (_table.AsTableImpl != null && _tableRule == null) { if (_source.Any()) newname = _table.AsTableImpl.GetTableNameByColumnValue(_table.AsTableColumn.GetValue(_source.FirstOrDefault())); diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index ab166af6..079df9af 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -567,7 +567,8 @@ namespace FreeSql.Internal.CommonProvider if (_tableRule == null && _table.AsTableImpl == null) return _commonUtils.GetEntityTableAopName(_table, true); var tbname = _table?.DbName ?? ""; string newname = null; - if (_table.AsTableImpl != null) + // 对于已经配置了TableNameImpl的表,也支持AsTable重设表名 by nsnail@2024年8月26日11:10:22 + if (_table.AsTableImpl != null && _tableRule == null) { if (_source.Any()) newname = _table.AsTableImpl.GetTableNameByColumnValue(_table.AsTableColumn.GetValue(_source.FirstOrDefault())); @@ -638,7 +639,7 @@ namespace FreeSql.Internal.CommonProvider return sb.ToString(); } } - + sb.Append("INSERT INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append('('); var colidx = 0; foreach (var col in _table.Columns.Values) @@ -735,4 +736,4 @@ namespace FreeSql.Internal.CommonProvider return dt; } } -} +} \ No newline at end of file diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 003dae8b..d95b7d52 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -734,7 +734,7 @@ namespace FreeSql.Internal.CommonProvider if (replval == null) continue; var replname = _commonUtils.QuoteSqlName(col.Column.Attribute.Name); expt = expt.Replace(replname, _commonUtils.IsNull(replname, _commonUtils.FormatSql("{0}", replval))); - } + } else if (col.Column.CsType == typeof(string)) { var replname = _commonUtils.QuoteSqlName(col.Column.Attribute.Name); @@ -898,7 +898,8 @@ namespace FreeSql.Internal.CommonProvider if (_tableRule == null && _table.AsTableImpl == null) return _commonUtils.GetEntityTableAopName(_table, true); var tbname = _table?.DbName ?? ""; string newname = null; - if (_table.AsTableImpl != null) + // 对于已经配置了TableNameImpl的表,也支持AsTable重设表名 by nsnail@2024年8月26日11:10:22 + if (_table.AsTableImpl != null && _tableRule == null) { if (_source.Any()) newname = _table.AsTableImpl.GetTableNameByColumnValue(_table.AsTableColumn.GetValue(_source.FirstOrDefault())); @@ -1123,7 +1124,7 @@ namespace FreeSql.Internal.CommonProvider sb.Append(col.DbUpdateValue); else { - var valsameIf = col.Attribute.MapType.IsNumberType() || + var valsameIf = col.Attribute.MapType.IsNumberType() || new[] { typeof(string), typeof(DateTime), typeof(DateTime?) }.Contains(col.Attribute.MapType) || col.Attribute.MapType.NullableTypeOrThis().IsEnum; var ds = _source.Select(a => col.GetDbValue(a)).ToArray(); @@ -1269,4 +1270,4 @@ namespace FreeSql.Internal.CommonProvider } } } -} +} \ No newline at end of file diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 4e3ac6cb..7ce00ef1 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -10,7 +10,7 @@ git MIT FreeSql;ORM;SqlServer;mssql - $(AssemblyName) + $(AssemblyName).NS logo.png $(AssemblyName) true @@ -18,10 +18,16 @@ true false key.snk - 3.5.100-preview20240825 + 3.5.100-preview20240825-ns1 readme.md + + FreeSql.Provider.SqlServer.xml + 3 + 1701;1702;1591 + + diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs index cecfc3c4..c9bf11dc 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs @@ -228,7 +228,17 @@ ELSE if (tbcol.IsDesc) sb.Append(" DESC"); sb.Append(", "); } - sb.Remove(sb.Length - 2, 2).Append(");\r\n"); + // sb.Remove(sb.Length - 2, 2).Append(");\r\n"); + // ↑ 解决唯一索引不可插入多个NULL的问题 ↓ + sb.Remove(sb.Length - 2, 2).Append(") WHERE "); + foreach (var tbcol in uk.Columns) + { + sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); + sb.Append(" IS NOT NULL"); + sb.Append(" AND "); + } + sb.Remove(sb.Length - 5, 5).Append(";\r\n"); + // nsnail@2023年2月4日14:54:52 ↑ } //备注 foreach (var tbcol in tb.ColumnsByPosition) @@ -449,7 +459,17 @@ use [" + database + "];", tboldname ?? tbname); if (tbcol.IsDesc) sb.Append(" DESC"); sb.Append(", "); } - sb.Remove(sb.Length - 2, 2).Append(");\r\n"); + // sb.Remove(sb.Length - 2, 2).Append(");\r\n"); + // ↑ 解决唯一索引不可插入多个NULL的问题 ↓ + sb.Remove(sb.Length - 2, 2).Append(") WHERE "); + foreach (var tbcol in uk.Columns) + { + sb.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); + sb.Append(" IS NOT NULL"); + sb.Append(" AND "); + } + sb.Remove(sb.Length - 5, 5).Append(";\r\n"); + // nsnail@2023年2月4日14:54:52 ↑ } sb.Append("COMMIT;\r\n"); } diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index c23ee441..523c4fec 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -10,7 +10,7 @@ git MIT FreeSql;ORM;sqlite - $(AssemblyName) + $(AssemblyName).NS logo.png $(AssemblyName) true @@ -18,10 +18,16 @@ true key.snk false - 3.5.100-preview20240825 + 3.5.100-preview20240825-ns1 readme.md + + FreeSql.Provider.Sqlite.xml + 3 + 1701;1702;1591 + + diff --git a/nuget/build-and-push.ps1 b/nuget/build-and-push.ps1 new file mode 100644 index 00000000..c13acf25 --- /dev/null +++ b/nuget/build-and-push.ps1 @@ -0,0 +1,62 @@ +# 定义参数 +Param( + # Nuget APIKey + [string] $apikey +) + +if ($apikey -eq $null -or $apikey -eq "") +{ + Write-Error "必须指定apiKey"; + return; +} + +rm -r ../FreeSql.DbContext/bin/Release +dotnet build -c Release ../FreeSql.sln + + +$files = Get-ChildItem -Path ../FreeSql/bin/Release -Filter *-ns*.nupkg +foreach($file in $files) +{ + dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json +} +$files = Get-ChildItem -Path ../FreeSql/bin/Release -Filter *-ns*.snupkg +foreach($file in $files) +{ + dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json +} + + +$files = Get-ChildItem -Path ../Providers/FreeSql.Provider.Sqlite/bin/Release -Filter *-ns*.nupkg +foreach($file in $files) +{ + dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json +} +$files = Get-ChildItem -Path ../Providers/FreeSql.Provider.Sqlite/bin/Release -Filter *-ns*.snupkg +foreach($file in $files) +{ + dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json +} + + +$files = Get-ChildItem -Path ../Providers/FreeSql.Provider.SqlServer/bin/Release -Filter *-ns*.nupkg +foreach($file in $files) +{ + dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json +} +$files = Get-ChildItem -Path ../Providers/FreeSql.Provider.SqlServer/bin/Release -Filter *-ns*.snupkg +foreach($file in $files) +{ + dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json +} + + +$files = Get-ChildItem -Path ../FreeSql.DbContext/bin/Release -Filter *-ns*.nupkg +foreach($file in $files) +{ + dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json +} +$files = Get-ChildItem -Path ../FreeSql.DbContext/bin/Release -Filter *-ns*.snupkg +foreach($file in $files) +{ + dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json +} \ No newline at end of file