From 53b85f125080796c3abb068d9cfc7eb914d9acc0 Mon Sep 17 00:00:00 2001 From: Dirk Seefeld Date: Mon, 17 Nov 2025 12:51:34 +0100 Subject: [PATCH 1/4] add EscapeTableColumAliasNames option to IDatabaseType --- src/NPoco.Abstractions/IDatabaseType.cs | 2 ++ src/NPoco/DatabaseType.cs | 6 ++++-- src/NPoco/DatabaseTypes/PostgreSQLDatabaseType.cs | 13 ++++++++----- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/NPoco.Abstractions/IDatabaseType.cs b/src/NPoco.Abstractions/IDatabaseType.cs index 2f6a0040..c2beea14 100644 --- a/src/NPoco.Abstractions/IDatabaseType.cs +++ b/src/NPoco.Abstractions/IDatabaseType.cs @@ -38,5 +38,7 @@ public interface IDatabaseType void PreExecute(DbCommand cmd); object ProcessDefaultMappings(PocoColumn pocoColumn, object value); bool UseColumnAliases(); + + bool EscapeTableColumAliasNames { get; set; } } } \ No newline at end of file diff --git a/src/NPoco/DatabaseType.cs b/src/NPoco/DatabaseType.cs index 3d382350..e78dbbc8 100644 --- a/src/NPoco/DatabaseType.cs +++ b/src/NPoco/DatabaseType.cs @@ -32,6 +32,8 @@ public abstract partial class DatabaseType : IDatabaseType readonly Dictionary typeMap; + public bool EscapeTableColumAliasNames { get; set; } = true; + public DatabaseType() { typeMap = new Dictionary(); @@ -190,7 +192,7 @@ public virtual string EscapeTableName(string tableName) /// The escaped identifier public virtual string EscapeSqlIdentifier(string str) { - return string.Format("[{0}]", str); + return EscapeTableColumAliasNames ? string.Format("[{0}]", str) : str; } /// @@ -259,7 +261,7 @@ public virtual async Task InsertBulkAsync(IDatabase db, IEnumerable pocos, /// /// /// - public static DatabaseType Resolve(string typeName, string providerName) + public static DatabaseType Resolve(string typeName, string providerName, bool escapeTableColumAliasNames = true) { // Try using type name first (more reliable) if (typeName.StartsWith("MySql")) diff --git a/src/NPoco/DatabaseTypes/PostgreSQLDatabaseType.cs b/src/NPoco/DatabaseTypes/PostgreSQLDatabaseType.cs index 035b7fad..03170201 100644 --- a/src/NPoco/DatabaseTypes/PostgreSQLDatabaseType.cs +++ b/src/NPoco/DatabaseTypes/PostgreSQLDatabaseType.cs @@ -23,17 +23,20 @@ public override object MapParameterValue(object value) public override string EscapeSqlIdentifier(string str) { - return string.Format("\"{0}\"", str); + return EscapeTableColumAliasNames ? string.Format("\"{0}\"", str) : str; } - + private void AdjustSqlInsertCommandText(DbCommand cmd, string primaryKeyName) { - cmd.CommandText += string.Format(" returning {0} as NewID", EscapeSqlIdentifier(primaryKeyName)); + if (primaryKeyName != "ID") + { + cmd.CommandText += string.Format(" returning {0} as NewID", EscapeSqlIdentifier(primaryKeyName)); + } } public override object ExecuteInsert(IDatabase db, DbCommand cmd, string primaryKeyName, bool useOutputClause, T poco, object[] args) { - if (primaryKeyName != null) + if (!string.IsNullOrEmpty(primaryKeyName)) { AdjustSqlInsertCommandText(cmd, primaryKeyName); return ((IDatabaseHelpers)db).ExecuteScalarHelper(cmd); @@ -62,7 +65,7 @@ public override string GetParameterPrefix(string connectionString) public override string GetProviderName() { - return "Npgsql2"; + return "Npgsql"; } } } \ No newline at end of file From d1e499b6dda8e1263f286b197a1fb2f875327ad0 Mon Sep 17 00:00:00 2001 From: Dirk Seefeld Date: Mon, 17 Nov 2025 16:42:09 +0100 Subject: [PATCH 2/4] restore base type --- src/NPoco/DatabaseType.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NPoco/DatabaseType.cs b/src/NPoco/DatabaseType.cs index e78dbbc8..eed4d247 100644 --- a/src/NPoco/DatabaseType.cs +++ b/src/NPoco/DatabaseType.cs @@ -192,7 +192,7 @@ public virtual string EscapeTableName(string tableName) /// The escaped identifier public virtual string EscapeSqlIdentifier(string str) { - return EscapeTableColumAliasNames ? string.Format("[{0}]", str) : str; + return string.Format("[{0}]", str); } /// From c46712366ba8979ebff0dfb8ae6f6d90f6bb2cc5 Mon Sep 17 00:00:00 2001 From: Dirk Seefeld Date: Mon, 17 Nov 2025 16:42:17 +0100 Subject: [PATCH 3/4] fix InMemoryDatabase connection --- test/NPoco.Tests/Common/InMemoryDatabase.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/NPoco.Tests/Common/InMemoryDatabase.cs b/test/NPoco.Tests/Common/InMemoryDatabase.cs index bb6d0f83..f99a2431 100644 --- a/test/NPoco.Tests/Common/InMemoryDatabase.cs +++ b/test/NPoco.Tests/Common/InMemoryDatabase.cs @@ -8,17 +8,20 @@ public class InMemoryDatabase : TestDatabase public InMemoryDatabase() { DbType = DatabaseType.SQLite; - ConnectionString = "Data Source=:memory:;Version=3;"; + var builder = new Microsoft.Data.Sqlite.SqliteConnectionStringBuilder() + { + Mode = Microsoft.Data.Sqlite.SqliteOpenMode.Memory + }; + ConnectionString = builder.ConnectionString; // "Data Source=:memory:;Version=3;"; ProviderName = DatabaseType.SQLite.GetProviderName(); - - RecreateDataBase(); + EnsureSharedConnectionConfigured(); + RecreateDataBase(); } public override void EnsureSharedConnectionConfigured() { if (Connection != null) return; - lock (_syncRoot) { From d9b599a743b86cdf53f472465f8afa54906d3dc5 Mon Sep 17 00:00:00 2001 From: Dirk Seefeld Date: Sat, 13 Dec 2025 18:05:47 +0100 Subject: [PATCH 4/4] include PR #723 adding .net10 target --- .../NPoco.Abstractions.csproj | 4 +- src/NPoco.JsonNet/NPoco.JsonNet.csproj | 52 ++++++++++--------- .../NPoco.SqlServer.SystemData.csproj | 44 ++++++++-------- src/NPoco.SqlServer/NPoco.SqlServer.csproj | 44 ++++++++-------- src/NPoco/NPoco.csproj | 7 +-- .../QueryTests/QueryProviderTests.cs | 31 ++++++----- test/NPoco.Tests/NPoco.Tests.csproj | 4 +- 7 files changed, 96 insertions(+), 90 deletions(-) diff --git a/src/NPoco.Abstractions/NPoco.Abstractions.csproj b/src/NPoco.Abstractions/NPoco.Abstractions.csproj index 576498e4..b1eaf886 100644 --- a/src/NPoco.Abstractions/NPoco.Abstractions.csproj +++ b/src/NPoco.Abstractions/NPoco.Abstractions.csproj @@ -2,8 +2,8 @@ Provides abstractions for NPoco - 6.1.0 - net462;netstandard2.0;netstandard2.1;net8.0 + 6.2.0 + net462;netstandard2.0;netstandard2.1;net8.0;net10.0 NPoco.Abstractions NPoco.Abstractions orm;sql;micro-orm;database;mvc diff --git a/src/NPoco.JsonNet/NPoco.JsonNet.csproj b/src/NPoco.JsonNet/NPoco.JsonNet.csproj index 0e27186c..d4102648 100644 --- a/src/NPoco.JsonNet/NPoco.JsonNet.csproj +++ b/src/NPoco.JsonNet/NPoco.JsonNet.csproj @@ -1,32 +1,34 @@  - - Provides an implementation to use Json.NET as the serializer for serialized columns - 5.7.1 - net461;netstandard2.0;netstandard2.1 - 5.7.0 - net461;netstandard2.0;netstandard2.1;net8.0 - 6.1.0 - net462;netstandard2.0;netstandard2.1;net8.0 - NPoco.JsonNet - NPoco.JsonNet - orm;sql;micro-orm;database;mvc - https://github.com/schotime/NPoco - false - false - false - false - false - false - latest - + + Provides an implementation to use Json.NET as the serializer for serialized columns + 5.7.1 + net461;netstandard2.0;netstandard2.1 + 5.7.0 + net461;netstandard2.0;netstandard2.1;net8.0 + 6.1.0 + net462;netstandard2.0;netstandard2.1;net8.0 + 6.2.0 + net462;netstandard2.0;netstandard2.1;net8.0;net10.0 + NPoco.JsonNet + NPoco.JsonNet + orm;sql;micro-orm;database;mvc + https://github.com/schotime/NPoco + false + false + false + false + false + false + latest + - - - + + + - + - + diff --git a/src/NPoco.SqlServer.SystemData/NPoco.SqlServer.SystemData.csproj b/src/NPoco.SqlServer.SystemData/NPoco.SqlServer.SystemData.csproj index c40d4a65..89811175 100644 --- a/src/NPoco.SqlServer.SystemData/NPoco.SqlServer.SystemData.csproj +++ b/src/NPoco.SqlServer.SystemData/NPoco.SqlServer.SystemData.csproj @@ -1,29 +1,31 @@  - - An extremely easy to use Micro-ORM supporting Sql Server. - 5.7.1 - net461;netstandard2.0;netstandard2.1 - 5.7.0 - net461;netstandard2.0;netstandard2.1;net8.0 - 6.1.0 - net462;netstandard2.0;netstandard2.1;net8.0 - NPoco.SqlServer.SystemData - NPoco.SqlServer.SystemData - Adam Schröder - orm;sql;micro-orm;database;mvc - https://github.com/schotime/NPoco - latest - enable - + + An extremely easy to use Micro-ORM supporting Sql Server. + 5.7.1 + net461;netstandard2.0;netstandard2.1 + 5.7.0 + net461;netstandard2.0;netstandard2.1;net8.0 + 6.1.0 + net462;netstandard2.0;netstandard2.1;net8.0 + 6.2.0 + net462;netstandard2.0;netstandard2.1;net8.0;net10.0 + NPoco.SqlServer.SystemData + NPoco.SqlServer.SystemData + Adam Schröder + orm;sql;micro-orm;database;mvc + https://github.com/schotime/NPoco + latest + enable + - - - + + + - + - + diff --git a/src/NPoco.SqlServer/NPoco.SqlServer.csproj b/src/NPoco.SqlServer/NPoco.SqlServer.csproj index 5de7517d..5c63f3b6 100644 --- a/src/NPoco.SqlServer/NPoco.SqlServer.csproj +++ b/src/NPoco.SqlServer/NPoco.SqlServer.csproj @@ -1,29 +1,31 @@  - - An extremely easy to use Micro-ORM supporting Sql Server. - 5.7.1 - net461;netstandard2.0;netstandard2.1 - 5.7.0 - net461;netstandard2.0;netstandard2.1;net8.0 - 6.1.0 - net462;netstandard2.0;netstandard2.1;net8.0 - NPoco.SqlServer - NPoco.SqlServer - Adam Schröder - orm;sql;micro-orm;database;mvc - https://github.com/schotime/NPoco - latest - enable - + + An extremely easy to use Micro-ORM supporting Sql Server. + 5.7.1 + net461;netstandard2.0;netstandard2.1 + 5.7.0 + net461;netstandard2.0;netstandard2.1;net8.0 + 6.1.0 + net462;netstandard2.0;netstandard2.1;net8.0 + 6.2.0 + net462;netstandard2.0;netstandard2.1;net8.0;net10.0 + NPoco.SqlServer + NPoco.SqlServer + Adam Schröder + orm;sql;micro-orm;database;mvc + https://github.com/schotime/NPoco + latest + enable + - + - + - - - + + + diff --git a/src/NPoco/NPoco.csproj b/src/NPoco/NPoco.csproj index 7bcc4be4..abff8448 100644 --- a/src/NPoco/NPoco.csproj +++ b/src/NPoco/NPoco.csproj @@ -2,7 +2,7 @@ An extremely easy to use Micro-ORM supporting Sql Server, MySQL, PostgreSQL, Oracle, Sqlite, SqlCE. - net462;netstandard2.0;netstandard2.1;net8.0 + net462;netstandard2.0;netstandard2.1;net8.0;net10.0 NPoco NPoco 5.7.1 @@ -23,9 +23,10 @@ - - + + + diff --git a/test/NPoco.Tests/FluentTests/QueryTests/QueryProviderTests.cs b/test/NPoco.Tests/FluentTests/QueryTests/QueryProviderTests.cs index 14682af6..b3bfef11 100644 --- a/test/NPoco.Tests/FluentTests/QueryTests/QueryProviderTests.cs +++ b/test/NPoco.Tests/FluentTests/QueryTests/QueryProviderTests.cs @@ -35,7 +35,7 @@ public void AnyQuery() { var userRecordsExist = Database.Query().Any(); IAsyncDatabase db = Database; - + Assert.AreEqual(true, userRecordsExist); } @@ -45,7 +45,7 @@ public void AnyQueryWithWhere() var userRecordsExist = Database.Query().Any(x => x.UserId == 1); Assert.AreEqual(true, userRecordsExist); } - + [Test] public void AnyQueryWithLimit() { @@ -56,7 +56,7 @@ public void AnyQueryWithLimit() [Test] public void DistinctQueryWithProjection() { - var userRecordsExist = Database.Query().Distinct(y => new {y.IsMale}); + var userRecordsExist = Database.Query().Distinct(y => new { y.IsMale }); Assert.AreEqual(2, userRecordsExist.Count); } @@ -94,7 +94,7 @@ public void QueryWithSeparateWheresProduceSameSql() var users1 = Database.Query().Where(x => x.UserId == 1).Where(x => x.UserId == 2).ToList(); var sql1 = ((Database)Database).LastSQL; var users2 = Database.Query().Where(x => x.UserId == 1 && x.UserId == 2).ToList(); - var sql2 = ((Database)Database).LastSQL.Replace("((","(").Replace("))", ")"); + var sql2 = ((Database)Database).LastSQL.Replace("((", "(").Replace("))", ")"); Assert.AreEqual(sql1, sql2); } @@ -109,7 +109,7 @@ public void QueryWithWhereFalse() [Test] public void QueryWithWhereContainsNoValues() { - var users = Database.Query().Where(x => new int[] {}.Contains(x.UserId)).ToList(); + var users = Database.Query().Where(x => new int[] { }.Contains(x.UserId)).ToList(); Assert.AreEqual(0, users.Count); } @@ -205,7 +205,7 @@ public void QueryWithOrderByThenByDescending() [Test] public void QueryWithOrderByDescendingThenBy() { - var users = Database.Query().Include(x=>x.House).OrderByDescending(x => x.House.HouseId).ThenBy(x => x.UserId).ToList(); + var users = Database.Query().Include(x => x.House).OrderByDescending(x => x.House.HouseId).ThenBy(x => x.UserId).ToList(); var inmemory = InMemoryUsers.OrderByDescending(x => x.House != null ? x.House.HouseId : -1).ThenBy(x => x.UserId).ToList(); Assert.AreEqual(15, users.Count); @@ -231,8 +231,8 @@ public void QueryWithOrderByDescendingThenByDescending() [Test] public void QueryWithLimit() { - var users = Database.Query().OrderBy(x=>x.UserId).Limit(5).ToList(); - var inmemory = InMemoryUsers.OrderBy(x=>x.UserId).Take(5).ToList(); + var users = Database.Query().OrderBy(x => x.UserId).Limit(5).ToList(); + var inmemory = InMemoryUsers.OrderBy(x => x.UserId).Take(5).ToList(); Assert.AreEqual(5, users.Count); for (int i = 0; i < users.Count; i++) @@ -244,7 +244,7 @@ public void QueryWithLimit() [Test] public void QueryWithLimitWithOffset() { - var users = Database.Query().OrderBy(x => x.UserId).Limit(5,5).ToList(); + var users = Database.Query().OrderBy(x => x.UserId).Limit(5, 5).ToList(); var inmemory = InMemoryUsers.OrderBy(x => x.UserId).Skip(5).Take(5).ToList(); Assert.AreEqual(5, users.Count); @@ -296,7 +296,7 @@ public void QueryWithWhereAnd() [Test] public void QueryWithInclude() { - var users = Database.Query().Include(x=>x.House).ToList(); + var users = Database.Query().Include(x => x.House).ToList(); Assert.AreEqual(15, users.Count); for (int i = 0; i < users.Count; i++) @@ -322,7 +322,7 @@ public void QueryWithIncludeOneToOne() [Test] public void QueryWithIncludeAndNestedWhere() { - var users = Database.Query().Include(x => x.House).Where(x=> x.House.Address == InMemoryHouses[0].Address).ToList(); + var users = Database.Query().Include(x => x.House).Where(x => x.House.Address == InMemoryHouses[0].Address).ToList(); var inmemory = InMemoryUsers.Where(x => x.House != null && x.House.Address == InMemoryHouses[0].Address).ToList(); Assert.AreEqual(1, users.Count); @@ -336,7 +336,7 @@ public void QueryWithIncludeAndNestedWhere() [Test] public void QueryWithIncludeAndNestedOrderBy() { - var users = Database.Query().Include(x => x.House).Where(x=>x.House != null).OrderBy(x => x.House.Address).ToList(); + var users = Database.Query().Include(x => x.House).Where(x => x.House != null).OrderBy(x => x.House.Address).ToList(); var inmemory = InMemoryUsers.Where(x => x.House != null).OrderBy(x => x.House.Address).ToList(); Assert.AreEqual(7, users.Count); @@ -391,8 +391,7 @@ public void QueryWithProjectionAndEnclosedMethod1() // these arguments are properly supported (ProcessMethodSearchRecursively supports // NewArrayExpression). var users = Database.Query() - .ProjectTo(x => new ProjectUser2 { FormattedAge = string.Format("{0:n2} {1:n2} {2:n2} {3:n2} {4:n2} {5:n2} {6:n2}", - x.Age, x.Age, x.Age, x.Age, x.Age, x.Age, x.Age) }); + .ProjectTo(x => new ProjectUser2 { FormattedAge = string.Format("{0:n2} {1:n2} {2:n2} {3:n2} {4:n2} {5:n2} {6:n2}", new object[] { x.Age, x.Age, x.Age, x.Age, x.Age, x.Age, x.Age }) }); Assert.AreEqual("21.00 21.00 21.00 21.00 21.00 21.00 21.00", users[0].FormattedAge); Assert.AreEqual(15, users.Count); @@ -491,9 +490,9 @@ public void QueryWithIncludeNestedOrderByLimitAndProjection() .Where(x => x.House != null) .OrderBy(x => x.House.HouseId) .Limit(5) - .ProjectTo(x => new { Address = (x.House != null ? x.House.Address : string.Empty), x.House.HouseId}); + .ProjectTo(x => new { Address = (x.House != null ? x.House.Address : string.Empty), x.House.HouseId }); - var inmemory = InMemoryUsers.Where(x => x.House != null).OrderBy(x => x.House.HouseId).Select(x => new {x.House.Address, x.House.HouseId}).ToList(); + var inmemory = InMemoryUsers.Where(x => x.House != null).OrderBy(x => x.House.HouseId).Select(x => new { x.House.Address, x.House.HouseId }).ToList(); Assert.AreEqual(5, users.Count); for (int i = 0; i < users.Count; i++) diff --git a/test/NPoco.Tests/NPoco.Tests.csproj b/test/NPoco.Tests/NPoco.Tests.csproj index eed8dd92..f804fc2a 100644 --- a/test/NPoco.Tests/NPoco.Tests.csproj +++ b/test/NPoco.Tests/NPoco.Tests.csproj @@ -2,8 +2,8 @@ NPoco Tests - 5.0.0 - net8.0 + 6.2.0 + net10.0 NPoco.Tests Library NPoco.Tests