10 Commity c6b850894c ... 59cb2ece91

Autor SHA1 Wiadomość Data
  Lith 59cb2ece91 Merge pull request #6 from LithWang/master 4 miesięcy temu
  Lith 4782cd4330 release/2.5.0 4 miesięcy temu
  Lith 42ddb269ba release/2.5.0 4 miesięcy temu
  Lith 0898e8c8f3 init test sh 4 miesięcy temu
  Lith d1205b10e1 2.5.0 4 miesięcy temu
  Lith e40eeca5fc DataSource 4 miesięcy temu
  Lith 30640a5bc9 make it work 4 miesięcy temu
  Lith bf3ca64a70 work 4 miesięcy temu
  Lith 6339a35562 InitEnv 4 miesięcy temu
  Lith 636d4c34ea upgrade net to 8.0 4 miesięcy temu
32 zmienionych plików z 381 dodań i 203 usunięć
  1. 6 1
      Publish/DevOps3/README.md
  2. 1 1
      Publish/DevOps3/build-bash/10.Test.bash
  3. 1 1
      Publish/DevOps3/build-bash/30.nuget-pack.sh
  4. 1 1
      Publish/DevOps3/build-bash/40.Station-publish.sh
  5. 1 1
      Publish/DevOps3/release-bash/72.nuget-push.sh
  6. 3 9
      Publish/environment/build-bash__10.Test__#1.InitEnv.sh
  7. 1 0
      Vitorm.PostgreSQL.sln
  8. 6 0
      doc/ReleaseNotes.md
  9. 2 2
      src/Versions.props
  10. 1 1
      src/Vitorm.PostgreSQL/DataProvider.cs
  11. 0 2
      src/Vitorm.PostgreSQL/DbContext_Extensions_UsePostgreSQL.cs
  12. 17 74
      src/Vitorm.PostgreSQL/SqlTranslateService.cs
  13. 15 9
      src/Vitorm.PostgreSQL/TranslateService/ExecuteDeleteTranslateService.cs
  14. 87 0
      src/Vitorm.PostgreSQL/TranslateService/ExecuteUpdateTranslateService.cs
  15. 73 0
      src/Vitorm.PostgreSQL/TranslateService/QueryTranslateService.cs
  16. 9 2
      src/Vitorm.PostgreSQL/Vitorm.PostgreSQL.csproj
  17. 4 4
      test/Vitorm.PostgreSQL.Data.MsTest/Vitorm.PostgreSQL.Data.MsTest.csproj
  18. 1 1
      test/Vitorm.PostgreSQL.Data.MsTest/appsettings.json
  19. 3 3
      test/Vitorm.PostgreSQL.MsTest/CommonTest/CRUD_Test.cs
  20. 10 5
      test/Vitorm.PostgreSQL.MsTest/CommonTest/EntityLoader_CustomLoader_Test.cs
  21. 2 2
      test/Vitorm.PostgreSQL.MsTest/CommonTest/Orm_Extensions_ExecuteDeleteAsync_Test.cs
  22. 2 2
      test/Vitorm.PostgreSQL.MsTest/CommonTest/Orm_Extensions_ExecuteDelete_Test.cs
  23. 3 3
      test/Vitorm.PostgreSQL.MsTest/CommonTest/Orm_Extensions_ExecuteUpdateAsync_Test.cs
  24. 3 3
      test/Vitorm.PostgreSQL.MsTest/CommonTest/Orm_Extensions_ExecuteUpdate_Test.cs
  25. 56 0
      test/Vitorm.PostgreSQL.MsTest/CommonTest/Query_Group_FirstOrDefault_Test.cs
  26. 44 0
      test/Vitorm.PostgreSQL.MsTest/CommonTest/Query_Where_In_Test.cs
  27. 4 46
      test/Vitorm.PostgreSQL.MsTest/CommonTest/Transaction_Test.cs
  28. 7 21
      test/Vitorm.PostgreSQL.MsTest/DataSource.cs
  29. 2 0
      test/Vitorm.PostgreSQL.MsTest/ExpressionNodesTest/ExpressionTester.Model.cs
  30. 11 4
      test/Vitorm.PostgreSQL.MsTest/ExpressionNodesTest/ExpressionTester.cs
  31. 4 4
      test/Vitorm.PostgreSQL.MsTest/Vitorm.PostgreSQL.MsTest.csproj
  32. 1 1
      test/Vitorm.PostgreSQL.MsTest/appsettings.json

+ 6 - 1
Publish/DevOps3/README.md

@@ -1,5 +1,5 @@
 
-# DevOps 3.7
+# DevOps 3.8
 
 
 # build-bash
@@ -24,6 +24,11 @@ if this file exists, will not need approval for jenkins build.
 ----------------------------------------------
 # ReleaseLog
 
+-----------------------
+# 3.8
+> 2024-12-19
+- upgrade net to 8.0
+
 -----------------------
 # 3.7
 > 2024-09-21

+ 1 - 1
Publish/DevOps3/build-bash/10.Test.bash

@@ -37,7 +37,7 @@ docker run -i --rm \
 -v $NUGET_PATH:/root/.nuget \
 -v "$basePath":/root/code \
 -v "$basePath":"$basePath" \
-serset/dotnet:sdk-6.0 \
+serset/dotnet:sdk-8.0 \
 bash -c "
 set -e
 

+ 1 - 1
Publish/DevOps3/build-bash/30.nuget-pack.sh

@@ -22,7 +22,7 @@ docker run -i --rm \
 --env LANG=C.UTF-8 \
 -v $NUGET_PATH:/root/.nuget \
 -v $basePath:/root/code \
-serset/dotnet:sdk-6.0 \
+serset/dotnet:sdk-8.0 \
 bash -c "
 
 publishPath=/root/code/Publish/release/release/nuget

+ 1 - 1
Publish/DevOps3/build-bash/40.Station-publish.sh

@@ -23,7 +23,7 @@ docker run -i --rm \
 -v $NUGET_PATH:/root/.nuget \
 -v "$basePath":/root/code \
 -v "$basePath":"$basePath" \
-serset/dotnet:sdk-6.0 \
+serset/dotnet:sdk-8.0 \
 bash -c "
 set -e
 

+ 1 - 1
Publish/DevOps3/release-bash/72.nuget-push.sh

@@ -25,7 +25,7 @@ fi
 docker run -i --rm \
 --env LANG=C.UTF-8 \
 -v $basePath:/root/code \
-serset/dotnet:sdk-6.0 \
+serset/dotnet:sdk-8.0 \
 bash -c "
 for file in /root/code/Publish/release/release/nuget/*.nupkg
 do

+ 3 - 9
Publish/environment/build-bash__10.Test__#1.InitEnv.sh

@@ -12,15 +12,9 @@ export basePath=/root/temp
 
 
 #---------------------------------------------------------------------
-echo '#build-bash__10.Test__#1.InitEnv.sh -> #1 start ClickHouse container'
+echo '#build-bash__10.Test__#1.InitEnv.sh -> #1 start PostgreSQL container'
 docker rm vitorm-postgres -f || true
-docker run -d \
---name vitorm-postgres \
--p 5432:5432 \
--e POSTGRES_PASSWORD='123456' \
--e POSTGRES_DB=db_dev \
--e ALLOW_IP_RANGE=0.0.0.0/0 \
-postgres:15.8
+docker run -d --name vitorm-postgres -p 5432:5432 -e POSTGRES_PASSWORD=123456 -e POSTGRES_DB=db_orm -e ALLOW_IP_RANGE=0.0.0.0/0 postgres:15.8
 
 
 #---------------------------------------------------------------------
@@ -28,7 +22,7 @@ echo '#build-bash__10.Test__#1.InitEnv.sh -> #8 wait for containers to init'
 
 
 echo '#build-bash__10.Test__#1.InitEnv.sh -> #8.1 wait for PostgreSQL to init' 
-docker run -t --rm --link vitorm-postgres postgres:15.8 timeout 120 sh -c "export PGPASSWORD=123456; until psql -h postgres -U postgres -d db_dev -c 'create database db_dev2;'; do echo waiting for PostgreSQL; sleep 2; done;"
+docker run -t --rm --link vitorm-postgres postgres:15.8 timeout 120 sh -c "export PGPASSWORD=123456; until psql -h vitorm-postgres -U postgres -d db_orm -c 'create database db_orm2;'; do echo waiting for PostgreSQL; sleep 2; done;"
 
 
 #---------------------------------------------------------------------

+ 1 - 0
Vitorm.PostgreSQL.sln

@@ -6,6 +6,7 @@ MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "doc", "doc", "{75C25D0B-8529-4E3F-AF43-6EC1E9E40828}"
 	ProjectSection(SolutionItems) = preProject
 		README.md = README.md
+		doc\ReleaseNotes.md = doc\ReleaseNotes.md
 	EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{7904FE51-04FF-4477-8E3A-CC340389EE32}"

+ 6 - 0
doc/ReleaseNotes.md

@@ -0,0 +1,6 @@
+# Vitorm.MongoDB ReleaseNotes
+
+-----------------------
+# 2.4.0
+- upgrade net to 8.0
+

+ 2 - 2
src/Versions.props

@@ -1,7 +1,7 @@
 <Project>
     <PropertyGroup>
-        <Version>develop</Version>
-        <Vitorm_Version>[2.2.2, 2.3.0)</Vitorm_Version>
+        <Version>2.5.0</Version>
+        <Vitorm_Version>[2.5.0, 2.6.0)</Vitorm_Version>
     </PropertyGroup>
 
     <PropertyGroup>

+ 1 - 1
src/Vitorm.PostgreSQL/DataProvider.cs

@@ -1,7 +1,7 @@
 using System.Collections.Generic;
 
-using Vitorm.DataProvider;
 using Vitorm.Sql;
+using Vitorm.Sql.DataProvider;
 
 namespace Vitorm.PostgreSQL
 {

+ 0 - 2
src/Vitorm.PostgreSQL/DbContext_Extensions_UsePostgreSQL.cs

@@ -20,7 +20,5 @@ namespace Vitorm
             return dbContext;
         }
 
-
-
     }
 }

+ 17 - 74
src/Vitorm.PostgreSQL/SqlTranslateService.cs

@@ -1,15 +1,12 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
 using System.Linq.Expressions;
-using System.Text;
 
 using Vit.Linq;
 using Vit.Linq.ExpressionNodes.ComponentModel;
 
 using Vitorm.Entity;
 using Vitorm.Sql.SqlTranslate;
-using Vitorm.StreamQuery;
 
 namespace Vitorm.PostgreSQL
 {
@@ -18,14 +15,16 @@ namespace Vitorm.PostgreSQL
         public static readonly SqlTranslateService Instance = new SqlTranslateService();
 
         protected override BaseQueryTranslateService queryTranslateService { get; }
-        protected override BaseQueryTranslateService executeUpdateTranslateService => throw new NotImplementedException();
         protected override BaseQueryTranslateService executeDeleteTranslateService { get; }
+        protected override BaseQueryTranslateService executeUpdateTranslateService { get; }
 
         public SqlTranslateService()
         {
-            queryTranslateService = new QueryTranslateService(this);
+            queryTranslateService = new Vitorm.PostgreSQL.TranslateService.QueryTranslateService(this);
 
             executeDeleteTranslateService = new Vitorm.PostgreSQL.TranslateService.ExecuteDeleteTranslateService(this);
+
+            executeUpdateTranslateService = new Vitorm.PostgreSQL.TranslateService.ExecuteUpdateTranslateService(this);
         }
         /// <summary>
         ///     Generates the delimited SQL representation of an identifier (column name, table name, etc.).
@@ -66,7 +65,7 @@ namespace Vitorm.PostgreSQL
                             // ##1 ToString
                             case nameof(object.ToString):
                                 {
-                                    return $"cast({EvalExpression(arg, methodCall.@object)} as Nullable(String) )";
+                                    return $"cast({EvalExpression(arg, methodCall.@object)} as text )";
                                 }
 
                             #region ##2 String method:  StartsWith EndsWith Contains
@@ -119,7 +118,7 @@ namespace Vitorm.PostgreSQL
 
                         if (targetType == typeof(string))
                         {
-                            return $"cast({EvalExpression(arg, convert.body)} as Nullable(String))";
+                            return $"cast({EvalExpression(arg, convert.body)} as text)";
                         }
 
                         return $"cast({EvalExpression(arg, convert.body)} as {targetDbType})";
@@ -131,21 +130,9 @@ namespace Vitorm.PostgreSQL
                         // ##1 String Add
                         if (node.valueType?.ToType() == typeof(string))
                         {
-                            // select ifNull( cast( (userFatherId) as Nullable(String) ) , '' )  from `User` 
-
-                            return $"CONCAT( {BuildSqlSentence(binary.left)} , {BuildSqlSentence(binary.right)} )";
+                            // select CONCAT("fatherId", '' )  from "User"
 
-                            string BuildSqlSentence(ExpressionNode node)
-                            {
-                                if (node.nodeType == NodeType.Constant)
-                                {
-                                    ExpressionNode_Constant constant = node;
-                                    if (constant.value == null) return "''";
-                                    else return $"cast( ({EvalExpression(arg, node)}) as String )";
-                                }
-                                else
-                                    return $"ifNull( cast( ({EvalExpression(arg, node)}) as Nullable(String) ) , '')";
-                            }
+                            return $"CONCAT( {EvalExpression(arg, binary.left)} , {EvalExpression(arg, binary.right)} )";
                         }
 
                         // ##2 Numeric Add
@@ -158,9 +145,9 @@ namespace Vitorm.PostgreSQL
                     }
                 case nameof(ExpressionType.Conditional):
                     {
-                        // IF(`t0`.`fatherId` is not null,true, false)
+                        // select (case when "fatherId" is not null then true else false end)  from "User"
                         ExpressionNode_Conditional conditional = node;
-                        return $"IF({EvalExpression(arg, conditional.Conditional_GetTest())},{EvalExpression(arg, conditional.Conditional_GetIfTrue())},{EvalExpression(arg, conditional.Conditional_GetIfFalse())})";
+                        return $"(case when {EvalExpression(arg, conditional.Conditional_GetTest())} then {EvalExpression(arg, conditional.Conditional_GetIfTrue())} else {EvalExpression(arg, conditional.Conditional_GetIfFalse())} end)";
                     }
                     #endregion
 
@@ -185,7 +172,7 @@ CREATE TABLE IF NOT exists "User" (
             List<string> sqlFields = new();
 
             // #1 columns
-            entityDescriptor.allColumns?.ForEach(column => sqlFields.Add(GetColumnSql(column)));
+            entityDescriptor.properties?.ForEach(column => sqlFields.Add(GetColumnSql(column)));
 
             return $@"
 CREATE TABLE IF NOT EXISTS {DelimitTableName(entityDescriptor)} (
@@ -193,7 +180,7 @@ CREATE TABLE IF NOT EXISTS {DelimitTableName(entityDescriptor)} (
 )
 ;";
 
-            string GetColumnSql(IColumnDescriptor column)
+            string GetColumnSql(IPropertyDescriptor column)
             {
                 var columnDbType = column.columnDbType ?? GetColumnDbType(column);
                 var defaultValue = column.isNullable ? "default null" : "";
@@ -216,11 +203,11 @@ CREATE TABLE IF NOT EXISTS {DelimitTableName(entityDescriptor)} (
         protected readonly static Dictionary<Type, string> columnDbTypeMap = new()
         {
             [typeof(DateTime)] = "timestamp",
-            [typeof(string)] = "varchar(1000)",
+            [typeof(string)] = "text",// varchar(1000)
 
-            [typeof(float)] = "real",
-            [typeof(double)] = "double",
-            [typeof(decimal)] = "numeric",
+            [typeof(float)] = "real", // float4
+            [typeof(double)] = "double precision", // float8
+            [typeof(decimal)] = "decimal",
 
             [typeof(Int64)] = "int8",
             [typeof(Int32)] = "int4",
@@ -236,7 +223,7 @@ CREATE TABLE IF NOT EXISTS {DelimitTableName(entityDescriptor)} (
             //[typeof(Guid)] = "UUID",
         };
 
-        protected override string GetColumnDbType(IColumnDescriptor column)
+        protected override string GetColumnDbType(IPropertyDescriptor column)
         {
             Type type = column.type;
 
@@ -266,50 +253,6 @@ CREATE TABLE IF NOT EXISTS {DelimitTableName(entityDescriptor)} (
             // drop table if exists `User`;
             return $@"drop table if exists {DelimitTableName(entityDescriptor)};";
         }
-        public override string PrepareTruncate(IEntityDescriptor entityDescriptor) => throw new NotSupportedException();
-
-        public override string PrepareExecuteUpdate(QueryTranslateArgument arg, CombinedStream combinedStream) => throw new NotImplementedException();
-
-
-        public override string PrepareDelete(SqlTranslateArgument arg)
-        {
-            // ALTER TABLE `User` DELETE WHERE `id`=2;
-            var entityDescriptor = arg.entityDescriptor;
-
-            // #2 build sql
-            string sql = $@"ALTER TABLE {DelimitTableName(entityDescriptor)} DELETE where {DelimitIdentifier(entityDescriptor.keyName)}={GenerateParameterName(entityDescriptor.keyName)} ; ";
-
-            return sql;
-        }
-
-        public override string PrepareDeleteByKeys<Key>(SqlTranslateArgument arg, IEnumerable<Key> keys)
-        {
-            //  ALTER TABLE `User` DELETE WHERE  id in ( 7 ) ;
-
-            var entityDescriptor = arg.entityDescriptor;
-
-            StringBuilder sql = new StringBuilder();
-
-            sql.Append("ALTER TABLE ").Append(DelimitTableName(entityDescriptor)).Append(" DELETE where ").Append(DelimitIdentifier(entityDescriptor.keyName)).Append(" in (");
-
-            if (keys.Any())
-            {
-                foreach (var key in keys)
-                {
-                    sql.Append(GenerateParameterName(arg.AddParamAndGetName(key))).Append(",");
-                }
-                sql.Length--;
-                sql.Append(");");
-            }
-            else
-            {
-                sql.Append("null);");
-            }
-            return sql.ToString();
-        }
-
-
-        public override (string sql, Func<object, Dictionary<string, object>> GetSqlParams) PrepareUpdate(SqlTranslateArgument arg) => throw new NotImplementedException();
 
 
     }

+ 15 - 9
src/Vitorm.PostgreSQL/TranslateService/ExecuteDeleteTranslateService.cs

@@ -6,13 +6,13 @@ namespace Vitorm.PostgreSQL.TranslateService
     public class ExecuteDeleteTranslateService : BaseQueryTranslateService
     {
         /*
-ALTER TABLE `User` DELETE 
-where id in (
-    select u.id 
-    from `User` u
-    left join `User` father on u.fatherId = father.id 
-    where u.id > 10
-);
+WITH tmp AS (
+    select u."userId" 
+    from "User" u
+    left join "User" father on u."fatherId" = father."userId"
+    where u."userId" > 0
+)
+delete from "User" where "userId" in ( SELECT "userId" FROM tmp );
          */
         public override string BuildQuery(QueryTranslateArgument arg, CombinedStream stream)
         {
@@ -20,11 +20,17 @@ where id in (
 
             var sqlInner = base.BuildQuery(arg, stream);
 
+
             var NewLine = "\r\n";
             var keyName = entityDescriptor.keyName;
 
-            var sql = $"ALTER TABLE {sqlTranslator.DelimitTableName(entityDescriptor)} DELETE";
-            sql += $"{NewLine}where {sqlTranslator.DelimitIdentifier(keyName)} in ({sqlInner})";
+            var sql = $"WITH tmp AS ( {NewLine}";
+            sql += sqlInner;
+
+            sql += $"{NewLine}){NewLine}";
+            sql += $"delete from {sqlTranslator.DelimitTableName(entityDescriptor)} ";
+
+            sql += $"{NewLine}where {sqlTranslator.DelimitIdentifier(keyName)} in ( SELECT {sqlTranslator.DelimitIdentifier(keyName)} FROM tmp ); {NewLine}";
 
             return sql;
         }

+ 87 - 0
src/Vitorm.PostgreSQL/TranslateService/ExecuteUpdateTranslateService.cs

@@ -0,0 +1,87 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Vitorm.Sql.SqlTranslate;
+using Vitorm.StreamQuery;
+
+namespace Vitorm.PostgreSQL.TranslateService
+{
+    public class ExecuteUpdateTranslateService : BaseQueryTranslateService
+    {
+        /*
+
+-- multiple
+WITH tmp AS (
+    select  concat('u' , u."userId", '_' , father."userId") as "userName" , u."userId" 
+    from "User" u
+    left join "User" father on u."fatherId" = father."userId"
+    where u."userId" > 0
+)
+UPDATE "User" t0
+  SET "userName" = tmp."userName"
+from tmp
+where t0."userId" = tmp."userId";
+         */
+        public override string BuildQuery(QueryTranslateArgument arg, CombinedStream stream)
+        {
+            var sqlInner = base.BuildQuery(arg, stream);
+
+            var entityDescriptor = arg.dbContext.GetEntityDescriptor(arg.resultEntityType);
+            var columnsToUpdate = (stream as StreamToUpdate)?.fieldsToUpdate?.memberArgs;
+
+            var NewLine = "\r\n";
+            var keyName = entityDescriptor.keyName;
+
+
+            var sql = $"WITH tmp AS ( {NewLine}";
+            sql += sqlInner;
+
+            sql += $"{NewLine}){NewLine}";
+            sql += $"UPDATE {sqlTranslator.DelimitTableName(entityDescriptor)} t0 {NewLine}";
+            sql += $"  Set ";
+
+            var sqlToUpdateCols = columnsToUpdate
+                .Select(m => m.name)
+                .Select(name =>
+                {
+                    var columnName = entityDescriptor.GetColumnNameByPropertyName(name);
+                    return $"{NewLine}  {sqlTranslator.DelimitIdentifier(columnName)} = {sqlTranslator.GetSqlField("tmp", name)} ";
+                });
+            sql += string.Join(",", sqlToUpdateCols);
+
+            sql += $"{NewLine} from tmp";
+
+            sql += $"{NewLine}where {sqlTranslator.GetSqlField("t0", keyName)}={sqlTranslator.GetSqlField("tmp", keyName)} ";
+
+            return sql;
+        }
+
+
+        public ExecuteUpdateTranslateService(SqlTranslateService sqlTranslator) : base(sqlTranslator)
+        {
+        }
+
+        protected override string ReadSelect(QueryTranslateArgument arg, CombinedStream stream, string prefix = "select")
+        {
+            var entityDescriptor = arg.dbContext.GetEntityDescriptor(arg.resultEntityType);
+            var columnsToUpdate = (stream as StreamToUpdate)?.fieldsToUpdate?.memberArgs;
+
+            if (columnsToUpdate?.Any() != true) throw new ArgumentException("can not get columns to update");
+
+            var sqlFields = new List<string>();
+
+            foreach (var column in columnsToUpdate)
+            {
+                sqlFields.Add($"({sqlTranslator.EvalExpression(arg, column.value)}) as {sqlTranslator.DelimitIdentifier(column.name)}");
+            }
+            // primary key
+            sqlFields.Add($"{sqlTranslator.GetSqlField(stream.source.alias, entityDescriptor.keyName)} as {sqlTranslator.DelimitIdentifier(entityDescriptor.keyName)}");
+
+            return prefix + " " + String.Join(",", sqlFields);
+        }
+
+
+
+    }
+}

+ 73 - 0
src/Vitorm.PostgreSQL/TranslateService/QueryTranslateService.cs

@@ -0,0 +1,73 @@
+using System.Linq;
+
+using Vitorm.Sql.SqlTranslate;
+using Vitorm.StreamQuery;
+
+namespace Vitorm.PostgreSQL.TranslateService
+{
+    public class QueryTranslateService : Vitorm.Sql.SqlTranslate.QueryTranslateService
+    {
+        public QueryTranslateService(SqlTranslateService sqlTranslator) : base(sqlTranslator)
+        {
+        }
+
+        public override string BuildQuery(QueryTranslateArgument arg, CombinedStream stream)
+        {
+
+            string sql = "";
+
+            // #0  select
+            sql += ReadSelect(arg, stream);
+
+
+            #region #1 from
+            sql += "\r\n from " + ReadInnerTable(arg, stream.source);
+            #endregion
+
+            #region #2 join
+            if (stream.joins != null)
+            {
+                sql += ReadJoin(arg, stream);
+            }
+            #endregion
+
+            // #3 where 1=1
+            if (stream.where != null)
+            {
+                var where = sqlTranslator.EvalExpression(arg, stream.where);
+                if (!string.IsNullOrWhiteSpace(where)) sql += "\r\n where " + where;
+            }
+
+            #region #4 group by
+            if (stream.groupByFields != null)
+            {
+                sql += "\r\n group by " + ReadGroupBy(arg, stream);
+            }
+            #endregion
+
+            #region #5 having
+            if (stream.having != null)
+            {
+                var where = sqlTranslator.EvalExpression(arg, stream.having);
+                if (!string.IsNullOrWhiteSpace(where)) sql += "\r\n having " + where;
+            }
+            #endregion
+
+
+            // #6 OrderBy
+            if (stream.orders?.Any() == true)
+            {
+                sql += "\r\n order by " + ReadOrderBy(arg, stream);
+            }
+
+            // #7 Range,  LIMIT 4 OFFSET 3
+            if (stream.take != null || stream.skip != null)
+            {
+                string sqlRange = (stream.take == null ? "" : (" LIMIT " + stream.take)) + (stream.skip == null ? "" : (" OFFSET " + stream.skip));
+                sql += "\r\n " + sqlRange;
+            }
+
+            return sql;
+        }
+    }
+}

+ 9 - 2
src/Vitorm.PostgreSQL/Vitorm.PostgreSQL.csproj

@@ -6,7 +6,7 @@
     </PropertyGroup>
 
     <PropertyGroup>
-        <TargetFramework>netstandard2.0</TargetFramework>
+        <TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net8.0</TargetFrameworks>
         <LangVersion>9.0</LangVersion>
     </PropertyGroup>
 
@@ -31,8 +31,15 @@
         </None>
     </ItemGroup>
 
+    <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0' Or '$(TargetFramework)' == 'netstandard2.1'">
+        <PackageReference Include="Npgsql" Version="8.0.6" />
+    </ItemGroup>
+
+    <ItemGroup Condition="'$(TargetFramework)' != 'netstandard2.0'">
+        <PackageReference Include="Npgsql" Version="9.0.2" />
+    </ItemGroup>
+
     <ItemGroup>
-        <PackageReference Include="Npgsql" Version="8.0.4" />
         <PackageReference Include="Vitorm" Version="$(Vitorm_Version)" />
     </ItemGroup>
 

+ 4 - 4
test/Vitorm.PostgreSQL.Data.MsTest/Vitorm.PostgreSQL.Data.MsTest.csproj

@@ -6,7 +6,7 @@
     </PropertyGroup>
 
     <PropertyGroup>
-        <TargetFramework>net6.0</TargetFramework>
+        <TargetFramework>net8.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
 
         <IsPackable>false</IsPackable>
@@ -15,9 +15,9 @@
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-        <PackageReference Include="MSTest.TestAdapter" Version="3.6.1" />
-        <PackageReference Include="MSTest.TestFramework" Version="3.6.1" />
+        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+        <PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
+        <PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
 
         <PackageReference Include="Vit.Core" Version="2.3.0" />
         <PackageReference Include="Vitorm.Data" Version="$(Vitorm_Version)" />

+ 1 - 1
test/Vitorm.PostgreSQL.Data.MsTest/appsettings.json

@@ -4,7 +4,7 @@
       {
         "provider": "PostgreSQL",
         "namespace": "Vitorm.MsTest",
-        "connectionString": "Host=localhost;Username=postgres;Password=123456;Database=db_dev;"
+        "connectionString": "Host=localhost;Username=postgres;Password=123456;Database=db_orm;"
       }
     ]
   }

+ 3 - 3
test/Vitorm.PostgreSQL.MsTest/CommonTest/CRUD_Test.cs

@@ -78,7 +78,7 @@ namespace Vitorm.MsTest.CommonTest
             // #2 Query
             {
                 var userList = dbContext.Query<User>().ToList();
-                Assert.AreEqual(6, userList.Count());
+                Assert.AreEqual(6, userList.Count);
             }
         }
         #endregion
@@ -108,7 +108,7 @@ namespace Vitorm.MsTest.CommonTest
             {
                 var newUserList = User.NewUsers(4, 3, forAdd: false);
                 var userList = dbContext.Query<User>().Where(m => m.id >= 4).ToList();
-                Assert.AreEqual(newUserList.Count, userList.Count());
+                Assert.AreEqual(newUserList.Count, userList.Count);
                 Assert.AreEqual(0, userList.Select(m => m.id).Except(newUserList.Select(m => m.id)).Count());
                 Assert.AreEqual(0, userList.Select(m => m.name).Except(newUserList.Select(m => m.name)).Count());
             }
@@ -158,7 +158,7 @@ namespace Vitorm.MsTest.CommonTest
             // assert
             {
                 var userList = dbContext.Query<User>().ToList();
-                Assert.AreEqual(0, userList.Count());
+                Assert.AreEqual(0, userList.Count);
             }
         }
         #endregion

+ 10 - 5
test/Vitorm.PostgreSQL.MsTest/CommonTest/EntityLoader_CustomLoader_Test.cs

@@ -4,6 +4,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting;
 
 using Vitorm.Entity;
 using Vitorm.Entity.Loader.DataAnnotations;
+using Vitorm.Entity.PropertyType;
 
 namespace Vitorm.MsTest.CommonTest
 {
@@ -120,7 +121,7 @@ namespace Vitorm.MsTest.CommonTest
             {
                 if (!GetTableName(entityType, out var tableName, out var schema)) return default;
 
-                IColumnDescriptor[] allColumns = entityType?.GetProperties(BindingFlags.Public | BindingFlags.Instance)
+                var propertyDescriptors = entityType?.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                     .Select(propertyInfo =>
                     {
                         var labels = propertyInfo?.GetCustomAttributes<LabelAttribute>();
@@ -152,15 +153,19 @@ namespace Vitorm.MsTest.CommonTest
                             }
                         }
 
-                        return new ColumnDescriptor(
-                            propertyInfo, columnName: columnName,
+                        return new PropertyDescriptor(
+                            propertyInfo, propertyType: new PropertyValueType(propertyInfo.PropertyType),
+                            columnName: columnName,
                             isKey: isKey, isIdentity: isIdentity, isNullable: isNullable,
                             columnDbType: columnDbType,
                             columnOrder: columnOrder
                             );
-                    }).Where(column => column != null).ToArray();
+                    }).Where(column => column != null);
 
-                return (true, new EntityDescriptor(entityType, allColumns, tableName, schema));
+                var propertyType = new PropertyObjectType(entityType);
+                propertyType.properties = propertyDescriptors.Select(m => (IPropertyDescriptor)m).ToArray();
+
+                return (true, new EntityDescriptor(propertyType, tableName, schema));
             }
         }
         #endregion

+ 2 - 2
test/Vitorm.PostgreSQL.MsTest/CommonTest/Orm_Extensions_ExecuteDeleteAsync_Test.cs

@@ -29,7 +29,7 @@ namespace Vitorm.MsTest.CommonTest
 
                 Assert.AreEqual(3, rowCount);
 
-                var newUsers = userQuery.ToList();
+                var newUsers = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual(3, newUsers.Count());
                 Assert.AreEqual(4, newUsers.First().id);
                 Assert.AreEqual(6, newUsers.Last().id);
@@ -43,7 +43,7 @@ namespace Vitorm.MsTest.CommonTest
 
                 Assert.AreEqual(2, rowCount);
 
-                var newUsers = userQuery.ToList();
+                var newUsers = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual(4, newUsers.Count());
                 Assert.AreEqual(1, newUsers.First().id);
                 Assert.AreEqual(3, newUsers[1].id);

+ 2 - 2
test/Vitorm.PostgreSQL.MsTest/CommonTest/Orm_Extensions_ExecuteDelete_Test.cs

@@ -29,7 +29,7 @@ namespace Vitorm.MsTest.CommonTest
 
                 Assert.AreEqual(3, rowCount);
 
-                var newUsers = userQuery.ToList();
+                var newUsers = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual(3, newUsers.Count());
                 Assert.AreEqual(4, newUsers.First().id);
                 Assert.AreEqual(6, newUsers.Last().id);
@@ -43,7 +43,7 @@ namespace Vitorm.MsTest.CommonTest
 
                 Assert.AreEqual(2, rowCount);
 
-                var newUsers = userQuery.ToList();
+                var newUsers = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual(4, newUsers.Count());
                 Assert.AreEqual(1, newUsers.First().id);
                 Assert.AreEqual(3, newUsers[1].id);

+ 3 - 3
test/Vitorm.PostgreSQL.MsTest/CommonTest/Orm_Extensions_ExecuteUpdateAsync_Test.cs

@@ -22,7 +22,7 @@ namespace Vitorm.MsTest.CommonTest
 
                 Assert.AreEqual(6, count);
 
-                var userList = userQuery.ToList();
+                var userList = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual("u_1_4_6", userList.First().name);
                 Assert.AreEqual(DateTime.Parse("2021-01-11 00:00:00"), userList.First().birth);
                 Assert.AreEqual("u_6__", userList.Last().name);
@@ -45,7 +45,7 @@ namespace Vitorm.MsTest.CommonTest
                 Assert.AreEqual(6, count);
 
 
-                var userList = userQuery.ToList();
+                var userList = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual("u2_1_4_6", userList.First().name);
                 Assert.AreEqual("u2_6__", userList.Last().name);
             }
@@ -68,7 +68,7 @@ namespace Vitorm.MsTest.CommonTest
                 Assert.AreEqual(3, count);
 
 
-                var userList = userQuery.ToList();
+                var userList = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual("u3_1_4_6", userList[0].name);
                 Assert.AreEqual("u3_3_5_6", userList[2].name);
                 Assert.AreEqual("u2_4__", userList[3].name);

+ 3 - 3
test/Vitorm.PostgreSQL.MsTest/CommonTest/Orm_Extensions_ExecuteUpdate_Test.cs

@@ -24,7 +24,7 @@ namespace Vitorm.MsTest.CommonTest
 
                 Assert.AreEqual(6, count);
 
-                var userList = userQuery.ToList();
+                var userList = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual("u_1_4_6", userList.First().name);
                 Assert.AreEqual(DateTime.Parse("2021-01-11 00:00:00"), userList.First().birth);
                 Assert.AreEqual("u_6__", userList.Last().name);
@@ -47,7 +47,7 @@ namespace Vitorm.MsTest.CommonTest
                 Assert.AreEqual(6, count);
 
 
-                var userList = userQuery.ToList();
+                var userList = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual("u2_1_4_6", userList.First().name);
                 Assert.AreEqual("u2_6__", userList.Last().name);
             }
@@ -70,7 +70,7 @@ namespace Vitorm.MsTest.CommonTest
                 Assert.AreEqual(3, count);
 
 
-                var userList = userQuery.ToList();
+                var userList = userQuery.OrderBy(m => m.id).ToList();
                 Assert.AreEqual("u3_1_4_6", userList[0].name);
                 Assert.AreEqual("u3_3_5_6", userList[2].name);
                 Assert.AreEqual("u2_4__", userList[3].name);

+ 56 - 0
test/Vitorm.PostgreSQL.MsTest/CommonTest/Query_Group_FirstOrDefault_Test.cs

@@ -0,0 +1,56 @@
+using System.Data;
+
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+
+namespace Vitorm.MsTest.CommonTest
+{
+    [TestClass]
+    public class Query_Group_FirstOrDefault_Test
+    {
+
+        [TestMethod]
+        public void Test_Group_FirstOrDefault()
+        {
+            using var dbContext = DataSource.CreateDbContext();
+            var userQuery = dbContext.Query<User>();
+
+            // Linq Expression
+            {
+                var query =
+                        from user in userQuery
+                        where user.fatherId != null
+                        group user by new { user.fatherId, user.motherId } into userGroup
+                        orderby userGroup.Key.fatherId, userGroup.Key.motherId
+                        select new { userGroup.Key.fatherId, userGroup.Key.motherId };
+
+                var row = query.FirstOrDefault();
+
+                Assert.AreEqual(4, row?.fatherId);
+                Assert.AreEqual(6, row?.motherId);
+            }
+
+            // Lambda Expression
+            {
+                var query =
+                        userQuery.Where(m => m.fatherId != null)
+                        .GroupBy(user => new { user.fatherId, user.motherId })
+                        .OrderBy(userGroup => userGroup.Key.fatherId).ThenBy(userGroup => userGroup.Key.motherId)
+                        .Select(userGroup => new
+                        {
+                            userGroup.Key.fatherId,
+                            userGroup.Key.motherId
+                        })
+                        ;
+
+                var row = query.FirstOrDefault();
+
+                Assert.AreEqual(4, row?.fatherId);
+                Assert.AreEqual(6, row?.motherId);
+            }
+        }
+
+
+
+    }
+}

+ 44 - 0
test/Vitorm.PostgreSQL.MsTest/CommonTest/Query_Where_In_Test.cs

@@ -0,0 +1,44 @@
+using System.Data;
+
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+using Vit.Linq;
+
+namespace Vitorm.MsTest.CommonTest
+{
+
+    [TestClass]
+    public class Query_Where_In_Test
+    {
+
+        [TestMethod]
+        public void Test_In()
+        {
+            using var dbContext = DataSource.CreateDbContext();
+            var userQuery = dbContext.Query<User>();
+
+            {
+                var ids = new[] { 1, 2 };
+                var userList = userQuery.Where(m => ids.Contains(m.id)).OrderBy(m => m.id).ToList();
+
+                var strIds = String.Join(',', userList.Select(m => m.id));
+                Assert.AreEqual(2, userList.Count);
+                Assert.AreEqual("1,2", strIds);
+            }
+
+
+            {
+                var ids = new List<int> { 1, 2 };
+                var userList = userQuery.Where(m => ids.Contains(m.id)).OrderBy(m => m.id).ToList();
+
+                var strIds = String.Join(',', userList.Select(m => m.id));
+                Assert.AreEqual(2, userList.Count);
+                Assert.AreEqual("1,2", strIds);
+            }
+
+        }
+
+
+
+    }
+}

+ 4 - 46
test/Vitorm.PostgreSQL.MsTest/CommonTest/Transaction_Test.cs

@@ -48,8 +48,7 @@ namespace Vitorm.MsTest.CommonTest
         }
 
 
-        // can not test for db is not durable
-        //[TestMethod]
+        [TestMethod]
         public void Test_Dispose()
         {
             {
@@ -72,58 +71,17 @@ namespace Vitorm.MsTest.CommonTest
                 }
                 Assert.AreEqual("u4003", userSet.Get(4).name);
             }
+
             {
-                using var dbContext = DataSource.CreateDbContext();
+                using var dbContext = DataSource.CreateDbContext(autoInit: false);
                 var userSet = dbContext.DbSet<User>();
 
-                //Assert.AreEqual("u4002", userSet.Get(4).name);
+                Assert.AreEqual("u4002", userSet.Get(4).name);
             }
 
         }
 
-        [TestMethod]
-        public void Test_NestedTransaction()
-        {
-            #region NestedTransaction
-            {
-                using var dbContext = DataSource.CreateDbContext();
-                var userSet = dbContext.DbSet<User>();
 
-                Assert.AreEqual("u400", userSet.Get(4).name);
-
-                using (var tran1 = dbContext.BeginTransaction())
-                {
-                    dbContext.Update(new User { id = 4, name = "u4001" });
-                    Assert.AreEqual("u4001", userSet.Get(4).name);
-
-                    using (var tran2 = dbContext.BeginTransaction())
-                    {
-                        dbContext.Update(new User { id = 4, name = "u4002" });
-                        Assert.AreEqual("u4002", userSet.Get(4).name);
-                    }
-                    Assert.AreEqual("u4001", userSet.Get(4).name);
-
-                    using (var tran2 = dbContext.BeginTransaction())
-                    {
-                        dbContext.Update(new User { id = 4, name = "u4002" });
-                        Assert.AreEqual("u4002", userSet.Get(4).name);
-                        tran2.Rollback();
-                    }
-                    Assert.AreEqual("u4001", userSet.Get(4).name);
-
-                    using (var tran2 = dbContext.BeginTransaction())
-                    {
-                        dbContext.Update(new User { id = 4, name = "u4003" });
-                        Assert.AreEqual("u4003", userSet.Get(4).name);
-                        tran2.Commit();
-                    }
-                    Assert.AreEqual("u4003", userSet.Get(4).name);
-                }
-
-                Assert.AreEqual("u400", userSet.Get(4).name);
-            }
-            #endregion
-        }
 
 
 

+ 7 - 21
test/Vitorm.PostgreSQL.MsTest/DataSource.cs

@@ -14,9 +14,13 @@ namespace Vitorm.MsTest
         [System.ComponentModel.DataAnnotations.Schema.Column("userName")]
         public string name { get; set; }
 
+        [System.ComponentModel.DataAnnotations.Schema.Column("userBirth")]
         public DateTime? birth { get; set; }
+        [System.ComponentModel.DataAnnotations.Schema.Column("userFatherId")]
         public int? fatherId { get; set; }
+        [System.ComponentModel.DataAnnotations.Schema.Column("userMotherId")]
         public int? motherId { get; set; }
+        [System.ComponentModel.DataAnnotations.Schema.Column("userClassId")]
         public int? classId { get; set; }
 
         public static User NewUser(int id, bool forAdd = false) => new User { id = id, name = "testUser" + id };
@@ -48,31 +52,13 @@ namespace Vitorm.MsTest
         readonly static string connectionString = Appsettings.json.GetStringByPath("Vitorm.PostgreSQL.connectionString");
 
 
-        public static SqlDbContext CreateDbContextForWriting(bool autoInit = true)
-        {
-            var dbContext = new SqlDbContext();
-            dbContext.UsePostgreSQL(connectionString);
-            dbContext.ChangeDatabase(dbContext.databaseName + "2");
-            if (autoInit) InitDbContext(dbContext);
-            return dbContext;
-        }
+        public static SqlDbContext CreateDbContextForWriting(bool autoInit = true) => CreateDbContext(autoInit);
 
-        static bool initedDefaultIndex = false;
-        public static SqlDbContext CreateDbContext()
+        public static SqlDbContext CreateDbContext(bool autoInit = true)
         {
             var dbContext = new SqlDbContext();
             dbContext.UsePostgreSQL(connectionString);
-
-            lock (typeof(DataSource))
-            {
-                if (!initedDefaultIndex)
-                {
-                    InitDbContext(dbContext);
-
-                    initedDefaultIndex = true;
-                }
-            }
-
+            if (autoInit) InitDbContext(dbContext);
             return dbContext;
         }
 

+ 2 - 0
test/Vitorm.PostgreSQL.MsTest/ExpressionNodesTest/ExpressionTester.Model.cs

@@ -3,6 +3,8 @@
 
     public abstract partial class ExpressionTester
     {
+        static bool canCalculate = true;
+
         [System.ComponentModel.DataAnnotations.Schema.Table("User2")]
         public class User : Vitorm.MsTest.User
         {

+ 11 - 4
test/Vitorm.PostgreSQL.MsTest/ExpressionNodesTest/ExpressionTester.cs

@@ -7,10 +7,8 @@ using Vit.Linq;
 
 namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
 {
-
     public abstract partial class ExpressionTester
     {
-
         public static List<User> Test(IQueryable<User> query, Expression<Func<User, bool>> predicate)
         {
             var expected = GetSourceData().AsQueryable().Where(predicate).ToList();
@@ -33,12 +31,12 @@ namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
         }
 
 
-
         public static void TestQueryable(IQueryable<User> query)
         {
             Expression<Func<User, bool>> predicate;
 
             #region #0 Add, An addition operation, such as a + b, without overflow checking, for numeric operands.
+            if (canCalculate)
             {
                 predicate = u => u.id + 1 == 6;
                 var rows = Test(query, predicate);
@@ -54,13 +52,15 @@ namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
             #endregion
 
             #region #7 Coalesce, A node that represents a null coalescing operation, such as (a ?? b)
+            if (canCalculate)
             {
                 predicate = u => (u.fatherId ?? u.id) == 5;
                 var rows = Test(query, predicate);
             }
             #endregion
 
-            #region #8 Conditional, A conditional operation, such as a > b ? a : b 
+            #region #8 Conditional, A conditional operation, such as a > b ? a : b
+            if (canCalculate)
             {
                 predicate = u => (u.id == 2 ? 1 : 0) == 1;
                 var rows = Test(query, predicate);
@@ -75,6 +75,7 @@ namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
             #endregion
 
             #region #10 Convert, A cast or conversion operation, such as (SampleType)obj
+            if (canCalculate)
             {
                 predicate = u => ((double)u.id) <= 2.0;
                 var rows = Test(query, predicate);
@@ -82,6 +83,7 @@ namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
             #endregion
 
             #region #12 Divide, A division operation, such as (a / b), for numeric operands.
+            if (canCalculate)
             {
                 predicate = u => u.id / 10.0 == 10.0;
                 var rows = Test(query, predicate);
@@ -135,6 +137,7 @@ namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
             #endregion
 
             #region #25 Modulo, An arithmetic remainder operation, such as (a % b)
+            if (canCalculate)
             {
                 predicate = u => (u.id % 10) == 0;
                 var rows = Test(query, predicate);
@@ -142,6 +145,7 @@ namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
             #endregion
 
             #region #26 Multiply, A multiplication operation, such as (a * b), without overflow checking, for numeric operands
+            if (canCalculate)
             {
                 predicate = u => u.id * 10 == 20;
                 var rows = Test(query, predicate);
@@ -149,6 +153,7 @@ namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
             #endregion
 
             #region #28 Negate, An arithmetic negation operation, such as (-a). The object a should not be modified in place.
+            if (canCalculate)
             {
                 predicate = u => -u.id == -2;
                 var rows = Test(query, predicate);
@@ -181,6 +186,7 @@ namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
             #endregion
 
             #region #42 Subtract,  A subtraction operation, such as (a - b), without overflow checking
+            if (canCalculate)
             {
                 predicate = u => u.id - 2 == 9;
                 var rows = Test(query, predicate);
@@ -189,6 +195,7 @@ namespace Vit.Linq.ExpressionNodes.ExpressionNodesTest
 
 
             #region Test the priority of mathematical calculations
+            if (canCalculate)
             {
                 predicate = u => 10 + u.id * 10 == 110;
                 var rows = Test(query, predicate);

+ 4 - 4
test/Vitorm.PostgreSQL.MsTest/Vitorm.PostgreSQL.MsTest.csproj

@@ -5,7 +5,7 @@
     </PropertyGroup>
 
     <PropertyGroup>
-        <TargetFramework>net6.0</TargetFramework>
+        <TargetFramework>net8.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
 
         <IsPackable>false</IsPackable>
@@ -14,9 +14,9 @@
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
-        <PackageReference Include="MSTest.TestAdapter" Version="3.6.1" />
-        <PackageReference Include="MSTest.TestFramework" Version="3.6.1" />
+        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+        <PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
+        <PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
 
         <PackageReference Include="Vit.Core" Version="2.3.0" />
     </ItemGroup>

+ 1 - 1
test/Vitorm.PostgreSQL.MsTest/appsettings.json

@@ -1,7 +1,7 @@
 {
   "Vitorm": {
     "PostgreSQL": {
-      "connectionString": "Host=localhost;Username=postgres;Password=123456;Database=db_dev;"
+      "connectionString": "Host=localhost;Username=postgres;Password=123456;Database=db_orm;"
     }
   }
 }