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