Lith 8 月之前
父节点
当前提交
ac1d2cdd6e
共有 39 个文件被更改,包括 1020 次插入208 次删除
  1. 30 0
      Publish/DevOps3/environment/README.md
  2. 34 0
      Publish/DevOps3/environment/build-bash__10.Test__#1.InitEnv.sh
  3. 22 0
      Publish/DevOps3/environment/build-bash__10.Test__#3.CleanEnv.sh
  4. 7 14
      Vitorm.MongoDB.sln
  5. 1 0
      doc/ReleaseLog.md
  6. 2 0
      doc/TODO.md
  7. 2 2
      src/Versions.props
  8. 15 1
      src/Vitorm.MongoDB/DbContext.cs
  9. 1 1
      src/Vitorm.MongoDB/DbSet.cs
  10. 1 4
      src/Vitorm.MongoDB/Vitorm.MongoDB.csproj
  11. 0 70
      test/Vitorm.MongoDB.Console/Program.cs
  12. 0 33
      test/Vitorm.MongoDB.Console/Program_Min.cs
  13. 0 14
      test/Vitorm.MongoDB.Console/Vitorm.MongoDB.Console.csproj
  14. 75 0
      test/Vitorm.MongoDB.Data.MsTest/CommonTest/Common_Test.cs
  15. 1 1
      test/Vitorm.MongoDB.Data.MsTest/CommonTest/UserTest.Entity.cs
  16. 291 0
      test/Vitorm.MongoDB.Data.MsTest/CommonTest/UserTest.cs
  17. 214 0
      test/Vitorm.MongoDB.Data.MsTest/CommonTest/UserTestAsync.cs
  18. 6 1
      test/Vitorm.MongoDB.Data.MsTest/Vitorm.MongoDB.Data.MsTest.csproj
  19. 12 0
      test/Vitorm.MongoDB.Data.MsTest/appsettings.json
  20. 80 0
      test/Vitorm.MongoDB.MsTest/CommonTest/ChangeDatabase_Test.cs
  21. 71 0
      test/Vitorm.MongoDB.MsTest/CommonTest/ChangeTable_Test.cs
  22. 0 1
      test/Vitorm.MongoDB.MsTest/CommonTest/EntityLoader_CustomLoader_Test.cs
  23. 8 10
      test/Vitorm.MongoDB.MsTest/CommonTest/Event_Test.cs
  24. 0 1
      test/Vitorm.MongoDB.MsTest/CommonTest/Property_Bool_Test.cs
  25. 3 3
      test/Vitorm.MongoDB.MsTest/CommonTest/Property_String_Like_Test.cs
  26. 0 2
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_Count_Test.cs
  27. 0 5
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_Distinct_Test.cs
  28. 0 7
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_Group_Test.cs
  29. 0 8
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_InnerJoin_ByJoin_Test.cs
  30. 0 5
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_InnerJoin_BySelectMany_Test.cs
  31. 0 3
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_LeftJoin_ByGroupJoin_Test.cs
  32. 0 2
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_LeftJoin_BySelectMany_Test.cs
  33. 0 5
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_Method_Test.cs
  34. 0 3
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_ScopeParam_LeftJoin_Test.cs
  35. 0 3
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_ScopeParam_Test.cs
  36. 1 6
      test/Vitorm.MongoDB.MsTest/CommonTest/Query_Select_Test.cs
  37. 132 0
      test/Vitorm.MongoDB.MsTest/CommonTest/Transaction_Test.cs
  38. 3 3
      test/Vitorm.MongoDB.MsTest/DataSource.cs
  39. 8 0
      test/Vitorm.MongoDB.MsTest/appsettings.json

+ 30 - 0
Publish/DevOps3/environment/README.md

@@ -0,0 +1,30 @@
+
+# DevOps 3.6
+
+
+# build-bash
+extra steps for build, all sh files are optional (remove if not need).
+
+
+# jenkins_NoNeedApprovalForBuild.txt
+if this file exists, will not need approval for jenkins build.
+
+
+----------------------------------------------
+# ReleaseLog
+
+-----------------------
+# 3.6
+> 2024-08-30
+
+- able to get release version from .props file
+- [github actions] auto trigger test workflow for PR in checks
+- [github actions] auto trigger test workflow for PR in checks
+
+-----------------------
+# 3.5
+> 2024-08-24
+
+- support tester
+
+

+ 34 - 0
Publish/DevOps3/environment/build-bash__10.Test__#1.InitEnv.sh

@@ -0,0 +1,34 @@
+set -e
+
+
+#---------------------------------------------------------------------
+# args
+
+args_="
+
+export basePath=/root/temp
+
+# "
+
+
+#---------------------------------------------------------------------
+echo '#build-bash__10.Test__#1.InitEnv.sh -> #1 start ElasticSearch container'
+docker rm vitorm-mongodb -f || true
+docker run -d \
+--name vitorm-mongodb \
+-p 27017:27017 \
+-e MONGO_INITDB_ROOT_USERNAME=mongoadmin \
+-e MONGO_INITDB_ROOT_PASSWORD=mongoadminsecret \
+mongo:4.4.29
+
+
+#---------------------------------------------------------------------
+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 ElasticSearch to init' 
+# docker run -t --rm --link vitorm-mongodb curlimages/curl timeout 120 sh -c 'until curl "http://vitorm-mongodb:9200"; do echo waiting for MongoDB; sleep 2; done;'
+
+
+#---------------------------------------------------------------------
+echo '#build-bash__10.Test__#1.InitEnv.sh -> #9 init test environment success!'

+ 22 - 0
Publish/DevOps3/environment/build-bash__10.Test__#3.CleanEnv.sh

@@ -0,0 +1,22 @@
+set -e
+
+
+#---------------------------------------------------------------------
+# args
+
+args_="
+
+export basePath=/root/temp
+
+# "
+
+
+#---------------------------------------------------------------------
+echo '#build-bash__10.Test_#3.CleanEnv.sh'
+
+
+echo '#build-bash__10.Test_#3.CleanEnv.sh -> #1 remove MongoDB'
+docker rm vitorm-mongodb -f || true
+
+
+

+ 7 - 14
Vitorm.MongoDB.sln

@@ -17,45 +17,38 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{05176905-A2A
 		src\Versions.props = src\Versions.props
 	EndProjectSection
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vitorm.Data.MsTest", "test\Vitorm.Data.MsTest\Vitorm.Data.MsTest.csproj", "{8643E97D-C1A8-434C-A393-CB1C4AA0B0D8}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vitorm.MongoDB", "src\Vitorm.MongoDB\Vitorm.MongoDB.csproj", "{7AC01F47-AD5A-4B61-9F05-38094C1EF23B}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vitorm.MongoDB.Console", "test\Vitorm.MongoDB.Console\Vitorm.MongoDB.Console.csproj", "{83947A51-9945-4851-9ABA-9661DB2069E4}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vitorm.MongoDB.MsTest", "test\Vitorm.MongoDB.MsTest\Vitorm.MongoDB.MsTest.csproj", "{42E0FE60-9E3B-4B59-A69E-E50A20C89D6D}"
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vitorm.MongoDB.Data.MsTest", "test\Vitorm.MongoDB.Data.MsTest\Vitorm.MongoDB.Data.MsTest.csproj", "{EB69697B-0CDB-4A28-AACF-22C31137DDE9}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{8643E97D-C1A8-434C-A393-CB1C4AA0B0D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{8643E97D-C1A8-434C-A393-CB1C4AA0B0D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{8643E97D-C1A8-434C-A393-CB1C4AA0B0D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{8643E97D-C1A8-434C-A393-CB1C4AA0B0D8}.Release|Any CPU.Build.0 = Release|Any CPU
 		{7AC01F47-AD5A-4B61-9F05-38094C1EF23B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{7AC01F47-AD5A-4B61-9F05-38094C1EF23B}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{7AC01F47-AD5A-4B61-9F05-38094C1EF23B}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{7AC01F47-AD5A-4B61-9F05-38094C1EF23B}.Release|Any CPU.Build.0 = Release|Any CPU
-		{83947A51-9945-4851-9ABA-9661DB2069E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{83947A51-9945-4851-9ABA-9661DB2069E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{83947A51-9945-4851-9ABA-9661DB2069E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{83947A51-9945-4851-9ABA-9661DB2069E4}.Release|Any CPU.Build.0 = Release|Any CPU
 		{42E0FE60-9E3B-4B59-A69E-E50A20C89D6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{42E0FE60-9E3B-4B59-A69E-E50A20C89D6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{42E0FE60-9E3B-4B59-A69E-E50A20C89D6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{42E0FE60-9E3B-4B59-A69E-E50A20C89D6D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EB69697B-0CDB-4A28-AACF-22C31137DDE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EB69697B-0CDB-4A28-AACF-22C31137DDE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EB69697B-0CDB-4A28-AACF-22C31137DDE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EB69697B-0CDB-4A28-AACF-22C31137DDE9}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
-		{8643E97D-C1A8-434C-A393-CB1C4AA0B0D8} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
 		{7AC01F47-AD5A-4B61-9F05-38094C1EF23B} = {05176905-A2A5-4015-9F04-2904506C902F}
-		{83947A51-9945-4851-9ABA-9661DB2069E4} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
 		{42E0FE60-9E3B-4B59-A69E-E50A20C89D6D} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
+		{EB69697B-0CDB-4A28-AACF-22C31137DDE9} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {C7DA16E3-9949-49FA-B0B4-F830636DE60F}

+ 1 - 0
doc/ReleaseLog.md

@@ -0,0 +1 @@
+# Vitorm.MongoDB ReleaseLog

+ 2 - 0
doc/TODO.md

@@ -0,0 +1,2 @@
+# Vitorm.MongoDB TODO
+

+ 2 - 2
src/Versions.props

@@ -1,6 +1,6 @@
 <Project>
     <PropertyGroup>
-        <Version>2.2.0-develop</Version>
-        <Vitorm_Version>[2.2.0, 2.3.0)</Vitorm_Version>
+        <Version>2.2.0-preview</Version>
+        <Vitorm_Version>[2.2.0-preview, 2.3.0)</Vitorm_Version>
     </PropertyGroup>
 </Project>

+ 15 - 1
src/Vitorm.MongoDB/DbContext.cs

@@ -1,4 +1,6 @@
-namespace Vitorm.MongoDB
+using System.Data;
+
+namespace Vitorm.MongoDB
 {
     public partial class DbContext : Vitorm.DbContext
     {
@@ -9,5 +11,17 @@
             this.dbConfig = dbConfig;
         }
 
+
+        #region Transaction
+        public virtual IDbTransaction BeginTransaction() => throw new System.NotImplementedException();
+        public virtual IDbTransaction GetCurrentTransaction() => throw new System.NotImplementedException();
+
+        #endregion
+
+
+
+        public virtual string databaseName => throw new System.NotImplementedException();
+        public virtual void ChangeDatabase(string databaseName) => throw new System.NotImplementedException();
+
     }
 }

+ 1 - 1
src/Vitorm.MongoDB/DbSet.cs

@@ -15,7 +15,7 @@ using Vitorm.Entity;
 namespace Vitorm.MongoDB
 {
     // https://www.mongodb.com/docs/drivers/csharp/current/
-
+    // https://learn.microsoft.com/zh-cn/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-8.0&tabs=visual-studio
 
     public class DbSetConstructor
     {

+ 1 - 4
src/Vitorm.MongoDB/Vitorm.MongoDB.csproj

@@ -32,11 +32,8 @@
 
     <ItemGroup>
         <PackageReference Include="MongoDB.Driver" Version="2.28.0" />
-        <!--<PackageReference Include="Vitorm" Version="$(Vitorm_Version)" />-->
+        <PackageReference Include="Vitorm" Version="$(Vitorm_Version)" />
     </ItemGroup>
 
-    <ItemGroup>
-      <ProjectReference Include="..\..\..\Vitorm\src\Vitorm\Vitorm.csproj" />
-    </ItemGroup>
 
 </Project>

+ 0 - 70
test/Vitorm.MongoDB.Console/Program.cs

@@ -1,70 +0,0 @@
-using System;
-using System.Linq;
-
-using Vitorm;
-namespace App
-{
-    public class Program
-    {
-        static void Main(string[] args)
-        {
-            // #1 Configures Vitorm
-            using var dbContext = new Vitorm.ElasticSearch.DbContext("http://localhost:9200");
-
-            // #2 Create Table
-            dbContext.TryDropTable<User>();
-            dbContext.TryCreateTable<User>();
-
-            // #3 Insert Records
-            dbContext.Add(new User { id = 1, name = "lith" });
-            dbContext.AddRange(new[] {
-                new User {   id = 2, name = "lith", fatherId = 1 },
-                new User {   id = 3, name = "lith", fatherId = 1 }
-            });
-
-            // #4 Query Records
-            {
-                var user = dbContext.Get<User>(1);
-                var users = dbContext.Query<User>().Where(u => u.name.Contains("li")).ToList();
-                var sql = dbContext.Query<User>().Where(u => u.name.Contains("li")).ToExecuteString();
-            }
-
-            // #5 Update Records
-            dbContext.Update(new User { id = 1, name = "lith1" });
-            dbContext.UpdateRange(new[] {
-                new User {   id = 2, name = "lith2", fatherId = 1 },
-                new User {   id = 3, name = "lith3", fatherId = 2 }
-            });
-            //dbContext.Query<User>().Where(u => u.name.Contains("li"))
-            //    .ExecuteUpdate(u => new User { name = "Lith" + u.id });
-
-            // #6 Delete Records
-            dbContext.Delete<User>(new User { id = 1 });
-            dbContext.DeleteRange(new[] {
-                new User {  id = 2 },
-                new User {  id = 3 }
-            });
-            dbContext.DeleteByKey<User>(1);
-            dbContext.DeleteByKeys<User, int>(new[] { 1, 2 });
-            //dbContext.Query<User>().Where(u => u.name.Contains("li"))
-            //    .ExecuteDelete();
-
-            // #7 Join Queries
-
-            // #8 Transactions
-
-            // #9 Database Functions
-        }
-
-        // Entity Definition
-        [System.ComponentModel.DataAnnotations.Schema.Table("User")]
-        public class User
-        {
-            [System.ComponentModel.DataAnnotations.Key]
-            public int id { get; set; }
-            public string name { get; set; }
-            public DateTime? birth { get; set; }
-            public int? fatherId { get; set; }
-        }
-    }
-}

+ 0 - 33
test/Vitorm.MongoDB.Console/Program_Min.cs

@@ -1,33 +0,0 @@
-using System;
-using System.Linq;
-using System.Threading;
-namespace App
-{
-    public class Program_Min
-    {
-        static void Main2(string[] args)
-        {
-            // #1 Init
-            using var dbContext = new Vitorm.ElasticSearch.DbContext("http://localhost:9200");
-            dbContext.TryDropTable<User>();
-            dbContext.TryCreateTable<User>();
-            dbContext.Add(new User { id = 1, name = "lith" });
-            Thread.Sleep(2000);
-
-            // #2 Query
-            var user = dbContext.Get<User>(1);
-            var users = dbContext.Query<User>().Where(u => u.name.Contains("li")).ToList();
-        }
-
-        // Entity Definition
-        [System.ComponentModel.DataAnnotations.Schema.Table("User")]
-        public class User
-        {
-            [System.ComponentModel.DataAnnotations.Key]
-            public int id { get; set; }
-            public string name { get; set; }
-            public DateTime? birth { get; set; }
-            public int? fatherId { get; set; }
-        }
-    }
-}

+ 0 - 14
test/Vitorm.MongoDB.Console/Vitorm.MongoDB.Console.csproj

@@ -1,14 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-    <PropertyGroup>
-        <OutputType>Exe</OutputType>
-        <TargetFramework>net6.0</TargetFramework>
-        <Nullable>enable</Nullable>
-    </PropertyGroup>
-
-    <ItemGroup>
-        <ProjectReference Include="..\..\src\Vitorm.ElasticSearch\Vitorm.MongoDB.csproj" />
-    </ItemGroup>
-
-
-</Project>

+ 75 - 0
test/Vitorm.MongoDB.Data.MsTest/CommonTest/Common_Test.cs

@@ -0,0 +1,75 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+
+namespace Vitorm.MsTest.CommonTest
+{
+    public class User : Vitorm.MsTest.CommonTest.UserBase
+    {
+    }
+
+
+    [TestClass]
+    public partial class Common_Test : UserTest<User>
+    {
+        [TestMethod]
+        public void Test()
+        {
+            Init();
+
+            Test_DbContext();
+            //Test_Transaction();
+            Test_Get();
+            Test_Query();
+            //Test_QueryJoin();
+            //Test_ToExecuteString();
+            //Test_ExecuteUpdate();
+            Test_ExecuteDelete();
+            Test_Create();
+            Test_Update();
+            Test_Delete();
+        }
+
+        [TestMethod]
+        public async Task TestAsync()
+        {
+            Init();
+
+            await Test_GetAsync();
+            await Test_QueryAsync();
+            //await Test_QueryJoinAsync();
+            await Test_ExecuteUpdateAsync();
+            await Test_ExecuteDeleteAsync();
+            await Test_UpdateAsync();
+            await Test_DeleteAsync();
+        }
+
+        public override User NewUser(int id, bool forAdd = false) => new User { id = id, name = "testUser" + id };
+
+        public override void WaitForUpdate() => Thread.Sleep(2000);
+
+        public void Init()
+        {
+            using var dbContext = Data.DataProvider<User>()?.CreateDbContext();
+
+            dbContext.TryDropTable<User>();
+            dbContext.TryCreateTable<User>();
+
+            var users = new List<User> {
+                    new User { id=1, name="u146", fatherId=4, motherId=6 },
+                    new User { id=2, name="u246", fatherId=4, motherId=6 },
+                    new User { id=3, name="u356", fatherId=5, motherId=6 },
+                    new User { id=4, name="u400" },
+                    new User { id=5, name="u500" },
+                    new User { id=6, name="u600" },
+                };
+            users.ForEach(user => { user.birth = DateTime.Parse("2021-01-01 00:00:00").AddHours(user.id); });
+
+            dbContext.AddRange(users);
+
+            WaitForUpdate();
+
+        }
+
+
+    }
+}

+ 1 - 1
test/Vitorm.Data.MsTest/UserBase.cs → test/Vitorm.MongoDB.Data.MsTest/CommonTest/UserTest.Entity.cs

@@ -1,5 +1,5 @@
 
-namespace Vitorm.MsTest
+namespace Vitorm.MsTest.CommonTest
 {
 
     [System.ComponentModel.DataAnnotations.Schema.Table("User")]

+ 291 - 0
test/Vitorm.MongoDB.Data.MsTest/CommonTest/UserTest.cs

@@ -0,0 +1,291 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+
+namespace Vitorm.MsTest.CommonTest
+{
+    public abstract partial class UserTest<User> where User : UserBase, new()
+    {
+        public virtual void WaitForUpdate() { }
+        public abstract User NewUser(int id, bool forAdd = false);
+
+        public virtual List<User> NewUsers(int startId, int count = 1, bool forAdd = false)
+        {
+            return Enumerable.Range(startId, count).Select(id => NewUser(id, forAdd)).ToList();
+        }
+
+
+        public void Test_DbContext()
+        {
+            #region #0 get DbContext and entityDescriptor
+            {
+                using var dbContext = Data.DataProvider<User>()?.CreateDbContext();
+                var entityDescriptor = dbContext.GetEntityDescriptor(typeof(User));
+                Assert.IsNotNull(entityDescriptor);
+            }
+            #endregion
+        }
+
+        public void Test_Transaction()
+        {
+            #region #0 Transaction
+            {
+                using var dbContext = Data.DataProvider<User>()?.CreateSqlDbContext();
+
+                Assert.AreEqual("u400", dbContext.Get<User>(4).name);
+
+                using (var tran1 = dbContext.BeginTransaction())
+                {
+                    dbContext.Update(new User { id = 4, name = "u4001" });
+                    Assert.AreEqual("u4001", dbContext.Get<User>(4).name);
+
+                    using (var tran2 = dbContext.BeginTransaction())
+                    {
+                        dbContext.Update(new User { id = 4, name = "u4002" });
+                        Assert.AreEqual("u4002", dbContext.Get<User>(4).name);
+
+                        var userSet = dbContext.DbSet<User>();
+                        Assert.AreEqual("u4002", userSet.Get(4).name);
+                    }
+                    Assert.AreEqual("u4001", dbContext.Get<User>(4).name);
+
+                    using (var tran2 = dbContext.BeginTransaction())
+                    {
+                        dbContext.Update(new User { id = 4, name = "u4002" });
+                        Assert.AreEqual("u4002", dbContext.Get<User>(4).name);
+                        tran2.Rollback();
+                    }
+                    Assert.AreEqual("u4001", dbContext.Get<User>(4).name);
+
+                    using (var tran2 = dbContext.BeginTransaction())
+                    {
+                        dbContext.Update(new User { id = 4, name = "u4003" });
+                        Assert.AreEqual("u4003", dbContext.Get<User>(4).name);
+                        tran2.Commit();
+                    }
+                    Assert.AreEqual("u4003", dbContext.Get<User>(4).name);
+
+                    //Assert.AreEqual("u400", Data.Get<User>(4).name);
+                }
+
+                Assert.AreEqual("u400", dbContext.Get<User>(4).name);
+            }
+            #endregion
+        }
+
+
+
+        public void Test_Get()
+        {
+            #region Get
+            {
+                var user = Data.Get<User>(1);
+                Assert.AreEqual(1, user?.id);
+            }
+            #endregion
+        }
+
+        public void Test_Query()
+        {
+            #region Query
+            {
+                var userList = Data.Query<User>().Where(u => u.id == 1).ToList();
+                Assert.AreEqual(1, userList.Count);
+                Assert.AreEqual(1, userList.First().id);
+            }
+            #endregion
+        }
+
+        public void Test_QueryJoin()
+        {
+            #region Query
+            {
+                var query =
+                    from user in Data.Query<User>()
+                    from father in Data.Query<User>().Where(father => user.fatherId == father.id)
+                    where user.id > 2
+                    select new { user, father };
+
+                var userList = query.ToList();
+                Assert.AreEqual(1, userList.Count);
+                Assert.AreEqual(3, userList.First().user.id);
+                Assert.AreEqual(5, userList.First().father.id);
+
+            }
+            #endregion
+        }
+        public void Test_ToExecuteString()
+        {
+            #region ToExecuteString
+            {
+                var query = Data.Query<User>().Where(u => u.id == 1);
+
+                var sql = query.ToExecuteString();
+                Assert.IsNotNull(sql);
+            }
+            #endregion
+        }
+        public void Test_ExecuteUpdate()
+        {
+            #region ExecuteUpdate
+            {
+                var query = Data.Query<User>();
+
+                var count = query.ExecuteUpdate(row => new User
+                {
+                    name = "u_" + row.id + "_" + (row.fatherId.ToString() ?? "") + "_" + (row.motherId.ToString() ?? ""),
+                    birth = DateTime.Parse("2021-01-11 00:00:00")
+                });
+
+                Assert.AreEqual(6, count);
+
+                WaitForUpdate();
+
+                var userList = query.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);
+            }
+            #endregion
+        }
+        public void Test_ExecuteDelete()
+        {
+            #region ExecuteDelete
+            {
+                var query = Data.Query<User>();
+
+                var count = query.Where(u => u.id == 6).ExecuteDelete();
+
+                //Assert.AreEqual(1, count);
+                WaitForUpdate();
+
+                var userList = query.ToList();
+                Assert.AreEqual(5, userList.Count());
+            }
+            #endregion
+        }
+        public void Test_Create()
+        {
+            #region Create :  Add AddRange
+            {
+                var newUserList = NewUsers(7, 4, forAdd: true);
+
+                // #1 Add
+                Data.Add<User>(newUserList[0]);
+
+                // #2 AddRange
+                Data.AddRange<User>(newUserList.Skip(1));
+
+                WaitForUpdate();
+
+                // assert
+                {
+                    var userList = Data.Query<User>().Where(user => user.id >= 7).ToList();
+                    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());
+                }
+            }
+            #endregion
+        }
+
+        public void Test_Update()
+        {
+            #region Update: Update UpdateRange
+            {
+                var ids = Data.Query<User>().OrderBy(u => u.id).Select(u => u.id).ToArray()[^2..];
+
+                var newUserList = ids.Select(id => NewUser(id)).Append(NewUser(ids.Last() + 1)).ToList();
+
+                // Update
+                {
+                    var rowCount = Data.Update(newUserList[0]);
+                    Assert.AreEqual(1, rowCount);
+                }
+
+                // UpdateRange
+                {
+                    var rowCount = Data.UpdateRange(newUserList.Skip(1));
+                    Assert.AreEqual(1, rowCount);
+                }
+
+                WaitForUpdate();
+
+                // assert
+                {
+                    var userList = Data.Query<User>().Where(m => ids.Contains(m.id)).ToList();
+                    Assert.AreEqual(2, 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());
+                }
+
+            }
+            #endregion
+        }
+
+        public void Test_Delete()
+        {
+            #region Delete : Delete DeleteRange DeleteByKey DeleteByKeys
+            {
+                // #1 Delete
+                {
+                    var rowCount = Data.Delete(NewUser(1));
+                    //Assert.AreEqual(1, rowCount);
+                }
+
+                // #2 DeleteRange
+                {
+                    var rowCount = Data.DeleteRange(NewUsers(2, 2));
+                    //Assert.AreEqual(2, rowCount);
+                }
+
+                // #3 DeleteByKey
+                {
+                    using var dbContext = Data.DataProvider<User>()?.CreateDbContext();
+                    var entityDescriptor = dbContext.GetEntityDescriptor(typeof(User));
+                    var key = entityDescriptor.key;
+
+                    var user = NewUser(4);
+                    var keyValue = key.GetValue(user);
+                    var rowCount = Data.DeleteByKey<User>(keyValue);
+                    //Assert.AreEqual(1, rowCount);
+                }
+
+
+                // assert
+                {
+                    WaitForUpdate();
+                    var userList = Data.Query<User>().Where(u => u.id <= 4).ToList();
+                    Assert.AreEqual(0, userList.Count());
+                }
+
+
+                // #4 DeleteByKeys
+                {
+                    using var dbContext = Data.DataProvider<User>()?.CreateDbContext();
+                    var entityDescriptor = dbContext.GetEntityDescriptor(typeof(User));
+                    var key = entityDescriptor.key;
+
+                    var users = Data.Query<User>().ToList();
+                    var keyValues = users.Select(user => key.GetValue(user));
+                    var rowCount = Data.DeleteByKeys<User, object>(keyValues);
+                    //Assert.AreEqual(users.Count, rowCount);
+                }
+
+
+                // assert
+                {
+                    WaitForUpdate();
+                    var userList = Data.Query<User>().ToList();
+                    Assert.AreEqual(0, userList.Count());
+                }
+            }
+            #endregion
+        }
+
+        public void Test_Truncate()
+        {
+            Data.Truncate<User>();
+        }
+
+    }
+}

+ 214 - 0
test/Vitorm.MongoDB.Data.MsTest/CommonTest/UserTestAsync.cs

@@ -0,0 +1,214 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+using Vit.Linq;
+
+namespace Vitorm.MsTest.CommonTest
+{
+    public abstract partial class UserTest<User>
+    {
+
+        public async Task Test_GetAsync()
+        {
+            #region Get
+            {
+                var user = await Data.GetAsync<User>(1);
+                Assert.AreEqual(1, user?.id);
+            }
+            #endregion
+        }
+
+        public async Task Test_QueryAsync()
+        {
+            #region Query
+            {
+                var userList = await Data.Query<User>().Where(u => u.id == 1).ToListAsync();
+                Assert.AreEqual(1, userList.Count);
+                Assert.AreEqual(1, userList.First().id);
+            }
+            #endregion
+        }
+
+        public async Task Test_QueryJoinAsync()
+        {
+            #region Query
+            {
+                var query =
+                    from user in Data.Query<User>()
+                    from father in Data.Query<User>().Where(father => user.fatherId == father.id)
+                    where user.id > 2
+                    select new { user, father };
+
+                var userList = await query.ToListAsync();
+                Assert.AreEqual(1, userList.Count);
+                Assert.AreEqual(3, userList.First().user.id);
+                Assert.AreEqual(5, userList.First().father.id);
+
+            }
+            #endregion
+        }
+
+        public async Task Test_ExecuteUpdateAsync()
+        {
+            #region ExecuteUpdate
+            {
+                var query = Data.Query<User>();
+
+                var count = await query.ExecuteUpdateAsync(row => new User
+                {
+                    name = "u_" + row.id + "_" + (row.fatherId.ToString() ?? "") + "_" + (row.motherId.ToString() ?? ""),
+                    birth = DateTime.Parse("2021-01-11 00:00:00")
+                });
+
+                Assert.AreEqual(6, count);
+
+                WaitForUpdate();
+
+                var userList = query.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);
+            }
+            #endregion
+        }
+        public async Task Test_ExecuteDeleteAsync()
+        {
+            #region ExecuteDelete
+            {
+                var query = Data.Query<User>();
+
+                var count = await query.Where(u => u.id == 6).ExecuteDeleteAsync();
+
+                //Assert.AreEqual(1, count);
+                WaitForUpdate();
+
+                var userList = query.ToList();
+                Assert.AreEqual(5, userList.Count());
+            }
+            #endregion
+        }
+        public async Task Test_CreateAsync()
+        {
+            #region Create :  Add AddRange
+            {
+                var newUserList = NewUsers(7, 4, forAdd: true);
+
+                // #1 Add
+                await Data.AddAsync<User>(newUserList[0]);
+
+                // #2 AddRange
+                await Data.AddRangeAsync<User>(newUserList.Skip(1));
+
+                WaitForUpdate();
+
+                // assert
+                {
+                    var userList = Data.Query<User>().Where(user => user.id >= 7).ToList();
+                    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());
+                }
+            }
+            #endregion
+        }
+
+        public async Task Test_UpdateAsync()
+        {
+            #region Update: Update UpdateRange
+            {
+                var ids = Data.Query<User>().OrderBy(u => u.id).Select(u => u.id).ToArray()[^2..];
+
+                var newUserList = ids.Select(id => NewUser(id)).Append(NewUser(ids.Last() + 1)).ToList();
+
+                // Update
+                {
+                    var rowCount = await Data.UpdateAsync(newUserList[0]);
+                    Assert.AreEqual(1, rowCount);
+                }
+
+                // UpdateRange
+                {
+                    var rowCount = await Data.UpdateRangeAsync(newUserList.Skip(1));
+                    Assert.AreEqual(1, rowCount);
+                }
+
+                WaitForUpdate();
+
+                // assert
+                {
+                    var userList = Data.Query<User>().Where(m => ids.Contains(m.id)).ToList();
+                    Assert.AreEqual(2, 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());
+                }
+
+            }
+            #endregion
+        }
+
+        public async Task Test_DeleteAsync()
+        {
+            #region Delete : Delete DeleteRange DeleteByKey DeleteByKeys
+            {
+                // #1 Delete
+                {
+                    var rowCount = await Data.DeleteAsync(NewUser(1));
+                    //Assert.AreEqual(1, rowCount);
+                }
+
+                // #2 DeleteRange
+                {
+                    var rowCount = await Data.DeleteRangeAsync(NewUsers(2, 2));
+                    //Assert.AreEqual(2, rowCount);
+                }
+
+                // #3 DeleteByKey
+                {
+                    using var dbContext = Data.DataProvider<User>()?.CreateDbContext();
+                    var entityDescriptor = dbContext.GetEntityDescriptor(typeof(User));
+                    var key = entityDescriptor.key;
+
+                    var user = NewUser(4);
+                    var keyValue = key.GetValue(user);
+                    var rowCount = await Data.DeleteByKeyAsync<User>(keyValue);
+                    //Assert.AreEqual(1, rowCount);
+                }
+
+
+                // assert
+                {
+                    WaitForUpdate();
+                    var userList = Data.Query<User>().Where(u => u.id <= 4).ToList();
+                    Assert.AreEqual(0, userList.Count());
+                }
+
+
+                // #4 DeleteByKeys
+                {
+                    using var dbContext = Data.DataProvider<User>()?.CreateDbContext();
+                    var entityDescriptor = dbContext.GetEntityDescriptor(typeof(User));
+                    var key = entityDescriptor.key;
+
+                    var users = Data.Query<User>().ToList();
+                    var keyValues = users.Select(user => key.GetValue(user));
+                    var rowCount = await Data.DeleteByKeysAsync<User, object>(keyValues);
+                    //Assert.AreEqual(users.Count, rowCount);
+                }
+
+
+                // assert
+                {
+                    WaitForUpdate();
+                    var userList = Data.Query<User>().ToList();
+                    Assert.AreEqual(0, userList.Count());
+                }
+            }
+            #endregion
+        }
+
+        public async Task Test_TruncateAsync()
+        {
+            await Data.TruncateAsync<User>();
+        }
+
+    }
+}

+ 6 - 1
test/Vitorm.Data.MsTest/Vitorm.Data.MsTest.csproj → test/Vitorm.MongoDB.Data.MsTest/Vitorm.MongoDB.Data.MsTest.csproj

@@ -1,4 +1,5 @@
 <Project Sdk="Microsoft.NET.Sdk">
+    <Import Project="..\..\src\Versions.props" />
 
     <PropertyGroup>
         <test>MSTest</test>
@@ -19,7 +20,11 @@
         <PackageReference Include="MSTest.TestFramework" Version="3.5.2" />
 
         <PackageReference Include="Vit.Core" Version="2.2.0" />
-        <PackageReference Include="Vitorm.Data" Version="[2.1.0, 2.2.0)" />
+        <PackageReference Include="Vitorm.Data" Version="$(Vitorm_Version)"  />
+    </ItemGroup>
+
+    <ItemGroup>
+        <ProjectReference Include="..\..\src\Vitorm.MongoDB\Vitorm.MongoDB.csproj" />
     </ItemGroup>
 
 

+ 12 - 0
test/Vitorm.MongoDB.Data.MsTest/appsettings.json

@@ -0,0 +1,12 @@
+{
+  "Vitorm": {
+    "Data": [
+      {
+        "provider": "MongoDB",
+        "namespace": "Vitorm.MsTest",
+        "connectionString": "mongodb://mongoadmin:mongoadminsecret@localhost:27017",
+        "database": "db_orm"
+      }
+    ]
+  }
+}

+ 80 - 0
test/Vitorm.MongoDB.MsTest/CommonTest/ChangeDatabase_Test.cs

@@ -0,0 +1,80 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Vitorm.MsTest.CommonTest
+{
+
+    [TestClass]
+    public partial class ChangeDatabase_Test
+    {
+
+        [TestMethod]
+        public void Test_ChangeDatabase()
+        {
+            string databaseName;
+
+            // database
+            {
+                using var dbContext = DataSource.CreateDbContextForWriting(autoInit: false);
+
+                databaseName = dbContext.databaseName;
+
+                dbContext.TryDropTable<User>();
+                dbContext.TryCreateTable<User>();
+
+                var user = dbContext.Get<User>(1);
+                Assert.IsNull(user);
+
+                user = User.NewUser(id: 1, forAdd: true);
+                user.name = "Hello database";
+                dbContext.Add(user);
+            }
+
+            // database2
+            {
+                using var dbContext = DataSource.CreateDbContextForWriting(autoInit: false);
+
+                dbContext.ChangeDatabase(databaseName + "2");
+
+                dbContext.TryDropTable<User>();
+                dbContext.TryCreateTable<User>();
+
+                var user = dbContext.Get<User>(1);
+                Assert.IsNull(user);
+
+                user = User.NewUser(id: 1, forAdd: true);
+                user.name = "Hello database2";
+                dbContext.Add(user);
+            }
+
+
+            DataSource.WaitForUpdate();
+
+            // database
+            {
+                using var dbContext = DataSource.CreateDbContextForWriting(autoInit: false);
+
+                dbContext.ChangeDatabase(databaseName);
+                var user = dbContext.Get<User>(1);
+                Assert.AreEqual("Hello database", user.name);
+            }
+
+            // database2
+            {
+                using var dbContext = DataSource.CreateDbContextForWriting(autoInit: false);
+
+                dbContext.ChangeDatabase(databaseName + "2");
+
+                var user = dbContext.Get<User>(1);
+                Assert.AreEqual("Hello database2", user.name);
+            }
+
+
+        }
+
+
+
+
+
+
+    }
+}

+ 71 - 0
test/Vitorm.MongoDB.MsTest/CommonTest/ChangeTable_Test.cs

@@ -0,0 +1,71 @@
+using System.Data;
+
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Vitorm.MsTest.CommonTest
+{
+
+    [TestClass]
+    public partial class ChangeTable_Test
+    {
+
+        [TestMethod]
+        public void Test_ChangeTable()
+        {
+            string tableName;
+
+            using var dbContext = DataSource.CreateDbContextForWriting();
+
+            var dbSet = dbContext.DbSet<User>();
+            tableName = dbSet.entityDescriptor.tableName;
+            User user;
+
+            // User
+            {
+                user = dbSet.Get(1);
+                Assert.IsNotNull(user);
+            }
+
+            // User2
+            {
+                dbSet.ChangeTable(tableName + "2");
+
+                dbSet.TryDropTable();
+                dbSet.TryCreateTable();
+
+                user = dbSet.Get(1);
+                Assert.IsNull(user);
+
+                var users = User.NewUsers(startId: 1, count: 5, forAdd: true);
+                user = users[1];
+                user.name = "Hello User2";
+                dbSet.AddRange(users);
+
+                dbSet.DeleteByKey(1);
+
+            }
+
+            DataSource.WaitForUpdate();
+
+            // Assert User2
+            {
+                var userList = dbSet.Query().Where(user => new[] { 1, 2, 3 }.Contains(user.id)).OrderBy(u => u.id).ToList();
+
+                Assert.AreEqual(2, userList.Count);
+                Assert.AreEqual(2, userList[0].id);
+                Assert.AreEqual("Hello User2", userList[0].name);
+            }
+
+            // Assert User
+            {
+                //dbSet.ChangeTableBack();
+                dbSet.ChangeTable(tableName);
+                Assert.AreEqual("u246", dbSet.Get(2)?.name);
+            }
+
+        }
+
+
+
+    }
+}

+ 0 - 1
test/Vitorm.MongoDB.MsTest/CommonTest/EntityLoader_CustomLoader_Test.cs

@@ -29,7 +29,6 @@ namespace Vitorm.MsTest.CommonTest
             // #1 EntityLoaderAttribute
             {
                 var users = dbContext.Query<CustomUser2>().Where(m => m.name == "u146").ToList();
-                var sql = dbContext.Query<CustomUser2>().Where(m => m.name == "u146").ToExecuteString();
                 Assert.AreEqual(1, users.Count());
                 Assert.AreEqual(1, users[0].id);
             }

+ 8 - 10
test/Vitorm.MongoDB.MsTest/CommonTest/Event_Test.cs

@@ -1,7 +1,5 @@
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 
-using Vit.Linq;
-
 namespace Vitorm.MsTest.CommonTest
 {
 
@@ -73,17 +71,17 @@ namespace Vitorm.MsTest.CommonTest
                 var result = dbContext.Query<User>().Count();
             }
             using (assertDisposable = new())
-            {
-                var result = dbContext.Query<User>().ToExecuteString();
-            }
-            using (assertDisposable = new())
             {
                 var result = dbContext.Query<User>().FirstOrDefault();
             }
-            using (assertDisposable = new())
-            {
-                var result = dbContext.Query<User>().ToListAndTotalCount();
-            }
+            //using (assertDisposable = new())
+            //{
+            //    var result = dbContext.Query<User>().ToExecuteString();
+            //}
+            //using (assertDisposable = new())
+            //{
+            //    var result = dbContext.Query<User>().ToListAndTotalCount();
+            //}
 
         }
 

+ 0 - 1
test/Vitorm.MongoDB.MsTest/CommonTest/Property_Bool_Test.cs

@@ -65,7 +65,6 @@ namespace Vitorm.MsTest.CommonTest
             }
             {
                 var query = dbSet.Query().Where(m => m.isEven.Value).OrderBy(m => m.isEven).Select(m => new { m.id, m.isEven });
-                var sql = query.ToExecuteString();
                 var users = query.ToList();
                 var user = users.First();
                 Assert.AreEqual(2, user.id);

+ 3 - 3
test/Vitorm.MongoDB.MsTest/CommonTest/Property_String_Like_Test.cs

@@ -18,7 +18,7 @@ namespace Vitorm.MsTest.CommonTest
             // StartsWith
             {
                 var query = userQuery.Where(u => u.name.StartsWith("u35"));
-                //var sql = query.ToExecuteString();
+
                 var userList = query.ToList();
                 Assert.AreEqual(1, userList.Count);
                 Assert.AreEqual(3, userList.First().id);
@@ -27,7 +27,7 @@ namespace Vitorm.MsTest.CommonTest
             // EndsWith
             {
                 var query = userQuery.Where(u => u.name.EndsWith("356"));
-                //var sql = query.ToExecuteString();
+
                 var userList = query.ToList();
                 Assert.AreEqual(1, userList.Count);
                 Assert.AreEqual(3, userList.First().id);
@@ -36,7 +36,7 @@ namespace Vitorm.MsTest.CommonTest
             // Contains
             {
                 var query = userQuery.Where(u => u.name.Contains("35"));
-                //var sql = query.ToExecuteString();
+
                 var userList = query.ToList();
                 Assert.AreEqual(1, userList.Count);
                 Assert.AreEqual(3, userList.First().id);

+ 0 - 2
test/Vitorm.MongoDB.MsTest/CommonTest/Query_Count_Test.cs

@@ -217,8 +217,6 @@ namespace Vitorm.MsTest.CommonTest
             if (config?.skip.HasValue == true) query = query.Skip(config.skip.Value);
             if (config?.take.HasValue == true) query = query.Take(config.take.Value);
 
-            var sql = query.ToExecuteString();
-
             var rows = query.ToList();
             int expectedCount = rows.Count;
 

+ 0 - 5
test/Vitorm.MongoDB.MsTest/CommonTest/Query_Distinct_Test.cs

@@ -18,7 +18,6 @@ namespace Vitorm.MsTest.CommonTest
             {
                 var query = userQuery.Select(u => u.fatherId).Distinct();
 
-                //var sql = query.ToExecuteString();
                 var fatherIds = query.ToList();
 
                 Assert.AreEqual(3, fatherIds.Count);
@@ -27,7 +26,6 @@ namespace Vitorm.MsTest.CommonTest
             {
                 var query = userQuery.Select(u => new { u.fatherId }).Distinct();
 
-                //var sql = query.ToExecuteString();
                 var userList = query.ToList();
                 var fatherIds = userList.Select(u => u.fatherId).ToList();
 
@@ -39,7 +37,6 @@ namespace Vitorm.MsTest.CommonTest
 
                 query = query.Skip(1).Take(100);
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
                 var fatherIds = userList.Select(u => u.fatherId).ToList();
                 var motherIds = userList.Select(u => u.motherId).ToList();
@@ -51,7 +48,6 @@ namespace Vitorm.MsTest.CommonTest
             {
                 var query = userQuery.Select(u => new { user = u, u.fatherId, u.motherId }).Distinct();
 
-                //var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(6, userList.Count);
@@ -59,7 +55,6 @@ namespace Vitorm.MsTest.CommonTest
             {
                 var query = userQuery.Distinct();
 
-                //var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(6, userList.Count);

+ 0 - 7
test/Vitorm.MongoDB.MsTest/CommonTest/Query_Group_Test.cs

@@ -22,7 +22,6 @@ namespace Vitorm.MsTest.CommonTest
                         group user by new { user.fatherId, user.motherId } into userGroup
                         select new { userGroup.Key.fatherId, userGroup.Key.motherId };
 
-                var sql = query.ToExecuteString();
                 var rows = query.ToList();
 
                 Assert.AreEqual(3, rows.Count);
@@ -42,7 +41,6 @@ namespace Vitorm.MsTest.CommonTest
                         })
                         ;
 
-                var sql = query.ToExecuteString();
                 var rows = query.ToList();
 
                 Assert.AreEqual(3, rows.Count);
@@ -69,7 +67,6 @@ namespace Vitorm.MsTest.CommonTest
 
                 query = query.Skip(1).Take(1);
 
-                var sql = query.ToExecuteString();
                 var rows = query.ToList();
 
                 Assert.AreEqual(1, rows.Count);
@@ -98,7 +95,6 @@ namespace Vitorm.MsTest.CommonTest
                         .Take(1)
                         ;
 
-                var sql = query.ToExecuteString();
                 var rows = query.ToList();
 
                 Assert.AreEqual(1, rows.Count);
@@ -135,7 +131,6 @@ namespace Vitorm.MsTest.CommonTest
                     })
                     ;
 
-                var sql = query.ToExecuteString();
                 var rows = query.ToList();
 
                 Assert.AreEqual(3, rows.Count);
@@ -156,7 +151,6 @@ namespace Vitorm.MsTest.CommonTest
                     ;
 
                 var rows = query.ToList();
-                var sql = query.ToExecuteString();
 
                 Assert.AreEqual(2, rows.Count);
                 Assert.AreEqual(5, rows[0].fatherId);
@@ -171,7 +165,6 @@ namespace Vitorm.MsTest.CommonTest
                     ;
 
                 var rows = query.ToList();
-                var sql = query.ToExecuteString();
 
                 Assert.AreEqual(2, rows.Count);
                 Assert.AreEqual(5, rows[0].fatherId);

+ 0 - 8
test/Vitorm.MongoDB.MsTest/CommonTest/Query_InnerJoin_ByJoin_Test.cs

@@ -23,7 +23,6 @@ namespace Vitorm.MsTest.CommonTest
                     where user.id > 2
                     select new { user, father };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -41,7 +40,6 @@ namespace Vitorm.MsTest.CommonTest
                     .Where(row => row.user.id > 2)
                     .Select(row => new { row.user, row.father });
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -76,7 +74,6 @@ namespace Vitorm.MsTest.CommonTest
                     };
                 query = query.Skip(1).Take(1);
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -118,7 +115,6 @@ namespace Vitorm.MsTest.CommonTest
 
                 query = query.Skip(1).Take(1);
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -150,7 +146,6 @@ namespace Vitorm.MsTest.CommonTest
                         , (user, father) => new { user, father }
                     );
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(3, userList.Count);
@@ -167,7 +162,6 @@ namespace Vitorm.MsTest.CommonTest
                         , (user, father) => new { user, father }
                     ).Where(row => row.user.id > 2);
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -184,7 +178,6 @@ namespace Vitorm.MsTest.CommonTest
                     ).Where(row => row.user.id > 2)
                     .Select(row => new { userId = row.user.id, fatherId = row.father.id });
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -202,7 +195,6 @@ namespace Vitorm.MsTest.CommonTest
 
                 query = query.Skip(1).Take(1);
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);

+ 0 - 5
test/Vitorm.MongoDB.MsTest/CommonTest/Query_InnerJoin_BySelectMany_Test.cs

@@ -23,7 +23,6 @@ namespace Vitorm.MsTest.CommonTest
                     where user.id > 2
                     select new { user, father };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -41,7 +40,6 @@ namespace Vitorm.MsTest.CommonTest
                     .Where(row => row.user.id > 2)
                     .Select(row => new { row.user, row.father });
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -75,7 +73,6 @@ namespace Vitorm.MsTest.CommonTest
                     };
                 query = query.Skip(1).Take(1);
 
-                //var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -113,7 +110,6 @@ namespace Vitorm.MsTest.CommonTest
 
                 query = query.Skip(1).Take(1);
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(1, userList.Count);
@@ -178,7 +174,6 @@ namespace Vitorm.MsTest.CommonTest
                                 motherName = mother.name,
                             };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(2, userList.Count);

+ 0 - 3
test/Vitorm.MongoDB.MsTest/CommonTest/Query_LeftJoin_ByGroupJoin_Test.cs

@@ -23,7 +23,6 @@ namespace Vitorm.MsTest.CommonTest
                     orderby user.id
                     select new { user, father };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(4, userList.Count);
@@ -50,7 +49,6 @@ namespace Vitorm.MsTest.CommonTest
                     .OrderBy(row2 => row2.row.user.id)
                     .Select(row2 => new { row2.row.user, row2.father });
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(4, userList.Count);
@@ -89,7 +87,6 @@ namespace Vitorm.MsTest.CommonTest
 
                 query = query.Skip(1).Take(2);
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(2, userList.Count);

+ 0 - 2
test/Vitorm.MongoDB.MsTest/CommonTest/Query_LeftJoin_BySelectMany_Test.cs

@@ -29,7 +29,6 @@ namespace Vitorm.MsTest.CommonTest
                         .OrderBy(row => row.user.id)
                         .Select(row => new { row.user, row.father });
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(4, userList.Count);
@@ -70,7 +69,6 @@ namespace Vitorm.MsTest.CommonTest
 
                 query = query.Skip(1).Take(2);
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(2, userList.Count);

+ 0 - 5
test/Vitorm.MongoDB.MsTest/CommonTest/Query_Method_Test.cs

@@ -57,7 +57,6 @@ namespace Vitorm.MsTest.CommonTest
                              })
                             .Skip(1).Take(2);
 
-                //var sql = query.ToExecuteString();
                 var list = query.ToList();
 
                 Assert.AreEqual(2, list.Count);
@@ -134,8 +133,6 @@ namespace Vitorm.MsTest.CommonTest
             {
                 var query = userQuery.OrderByDescending(user => user.id);
 
-                //var sql = query.ToExecuteString();
-
                 var userList = query.ToList();
                 Assert.AreEqual(6, userList.Count);
                 Assert.AreEqual(6, userList[0].id);
@@ -144,8 +141,6 @@ namespace Vitorm.MsTest.CommonTest
             {
                 var query = userQuery.OrderByDescending(user => user.id).Select(user => new { fid = user.fatherId, user.id });
 
-                //var sql = query.ToExecuteString();
-
                 var userList = query.ToList();
                 Assert.AreEqual(6, userList.Count);
                 Assert.AreEqual(6, userList[0].id);

+ 0 - 3
test/Vitorm.MongoDB.MsTest/CommonTest/Query_ScopeParam_LeftJoin_Test.cs

@@ -27,7 +27,6 @@ namespace Vitorm.MsTest.CommonTest
                         orderby user.id
                         select new { user, father };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(4, userList.Count);
@@ -47,7 +46,6 @@ namespace Vitorm.MsTest.CommonTest
                         orderby user.id
                         select new { user, father };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(4, userList.Count);
@@ -71,7 +69,6 @@ namespace Vitorm.MsTest.CommonTest
                         orderby user.id
                         select new { user, father };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(4, userList.Count);

+ 0 - 3
test/Vitorm.MongoDB.MsTest/CommonTest/Query_ScopeParam_Test.cs

@@ -26,7 +26,6 @@ namespace Vitorm.MsTest.CommonTest
                         orderby user.id
                         select new { user };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(4, userList.Count);
@@ -43,7 +42,6 @@ namespace Vitorm.MsTest.CommonTest
                         orderby user.id
                         select new { user };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(4, userList.Count);
@@ -64,7 +62,6 @@ namespace Vitorm.MsTest.CommonTest
                 orderby user.id
                 select new { user };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
 
                 Assert.AreEqual(4, userList.Count);

+ 1 - 6
test/Vitorm.MongoDB.MsTest/CommonTest/Query_Select_Test.cs

@@ -62,7 +62,6 @@ namespace Vitorm.MsTest.CommonTest
                         trueValue = true,
                     };
 
-                var sql = query.ToExecuteString();
                 var rows = query.ToList();
             }
 
@@ -77,7 +76,7 @@ namespace Vitorm.MsTest.CommonTest
                         uniqueId1 = user.id + "_" + user.fatherId + "_" + user.motherId,
                         uniqueId2 = $"{user.id}_{user.fatherId}_{user.motherId}"
                     };
-                var sql = query.ToExecuteString();
+
                 var userList = query.ToList();
                 Assert.AreEqual(6, userList.Count);
                 Assert.AreEqual("1_4_6", userList[0].uniqueId1);
@@ -106,7 +105,6 @@ namespace Vitorm.MsTest.CommonTest
                     select new User2(user.id)
                     ;
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
                 Assert.AreEqual(5, userList.Count);
 
@@ -120,7 +118,6 @@ namespace Vitorm.MsTest.CommonTest
                     select new User2(user.name)
                     ;
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
                 Assert.AreEqual(5, userList.Count);
             }
@@ -137,7 +134,6 @@ namespace Vitorm.MsTest.CommonTest
                     }
                     ;
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
                 Assert.AreEqual(5, userList.Count);
 
@@ -154,7 +150,6 @@ namespace Vitorm.MsTest.CommonTest
                         fatherId = 12,
                     };
 
-                var sql = query.ToExecuteString();
                 var userList = query.ToList();
                 Assert.AreEqual(5, userList.Count);
             }

+ 132 - 0
test/Vitorm.MongoDB.MsTest/CommonTest/Transaction_Test.cs

@@ -0,0 +1,132 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Vitorm.MsTest.CommonTest
+{
+
+    [TestClass]
+    public class Transaction_Test
+    {
+
+        [TestMethod]
+        public void Test_Transaction()
+        {
+            #region Transaction
+            {
+                using var dbContext = DataSource.CreateDbContext();
+                var userSet = dbContext.DbSet<User>();
+
+                Assert.AreEqual("u400", userSet.Get(4).name);
+
+                dbContext.Update(new User { id = 4, name = "u4001" });
+                Assert.AreEqual("u4001", userSet.Get(4).name);
+
+                using (var tran = 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 tran = dbContext.BeginTransaction())
+                {
+                    dbContext.Update(new User { id = 4, name = "u4002" });
+                    Assert.AreEqual("u4002", userSet.Get(4).name);
+                    tran.Rollback();
+                }
+                Assert.AreEqual("u4001", userSet.Get(4).name);
+
+                using (var tran = dbContext.BeginTransaction())
+                {
+                    dbContext.Update(new User { id = 4, name = "u4003" });
+                    Assert.AreEqual("u4003", userSet.Get(4).name);
+                    tran.Commit();
+                }
+                Assert.AreEqual("u4003", userSet.Get(4).name);
+
+            }
+            #endregion
+        }
+
+
+        // can not test for db is not durable
+        //[TestMethod]
+        public void Test_Dispose()
+        {
+            {
+                using var dbContext = DataSource.CreateDbContext();
+                var userSet = dbContext.DbSet<User>();
+
+                var tran2 = dbContext.BeginTransaction();
+                {
+                    dbContext.Update(new User { id = 4, name = "u4002" });
+                    Assert.AreEqual("u4002", userSet.Get(4).name);
+                    tran2.Commit();
+                }
+
+                Assert.AreEqual("u4002", userSet.Get(4).name);
+
+                var tran3 = dbContext.BeginTransaction();
+                {
+                    dbContext.Update(new User { id = 4, name = "u4003" });
+                    Assert.AreEqual("u4003", userSet.Get(4).name);
+                }
+                Assert.AreEqual("u4003", userSet.Get(4).name);
+            }
+            {
+                using var dbContext = DataSource.CreateDbContext();
+                var userSet = dbContext.DbSet<User>();
+
+                //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
+        }
+
+
+
+
+    }
+}

+ 3 - 3
test/Vitorm.MongoDB.MsTest/DataSource.cs

@@ -75,8 +75,8 @@ namespace Vitorm.MsTest
     {
         public static void WaitForUpdate() { }
 
-        public static DbContext CreateDbContextForWriting(bool autoInit = true) => CreateDbContext(autoInit);
-        public static DbContext CreateDbContext(bool autoInit = true)
+        public static Vitorm.MongoDB.DbContext CreateDbContextForWriting(bool autoInit = true) => CreateDbContext(autoInit);
+        public static Vitorm.MongoDB.DbContext CreateDbContext(bool autoInit = true)
         {
             var dbConfig = new DbConfig(Appsettings.json.GetByPath<Dictionary<string, object>>("Vitorm.MongoDB"));
             var dbContext = new Vitorm.MongoDB.DbContext(dbConfig);
@@ -90,7 +90,7 @@ namespace Vitorm.MsTest
         }
 
 
-        public static void InitDbContext(DbContext dbContext)
+        public static void InitDbContext(Vitorm.MongoDB.DbContext dbContext)
         {
             #region #1 init User
             {

+ 8 - 0
test/Vitorm.MongoDB.MsTest/appsettings.json

@@ -0,0 +1,8 @@
+{
+  "Vitorm": {
+    "MongoDB": {
+      "connectionString": "mongodb://mongoadmin:mongoadminsecret@localhost:27017",
+      "database": "db_orm"
+    }
+  }
+}