Przeglądaj źródła

Merge pull request #3 from LithWang/master

2.2.0
Lith 7 miesięcy temu
rodzic
commit
a40204a1b2
58 zmienionych plików z 689 dodań i 66 usunięć
  1. 10 4
      README.md
  2. 41 13
      Vitorm.File.sln
  3. 0 1
      doc/ReleaseLog.md
  4. 7 0
      doc/ReleaseNotes.md
  5. 2 2
      src/Versions.props
  6. 13 3
      src/Vitorm.File/DbConfig.cs
  7. 3 0
      src/Vitorm.File/DbContext.cs
  8. 28 0
      src/Vitorm.File/DbSetConstructor.cs
  9. 33 0
      src/Vitorm.File/DbSet_RowMapToFile.cs
  10. 18 28
      src/Vitorm.File/DbSet_TableToDir.cs
  11. 294 0
      src/Vitorm.File/DbSet_TableToFile.cs
  12. 1 1
      src/Vitorm.File/Vitorm.File.csproj
  13. 39 0
      test/Vitorm.File.RowMapToFile.Data.MsTest/Vitorm.File.RowMapToFile.Data.MsTest.csproj
  14. 12 0
      test/Vitorm.File.RowMapToFile.Data.MsTest/appsettings.json
  15. 36 0
      test/Vitorm.File.RowMapToFile.MsTest/Vitorm.File.RowMapToFile.MsTest.csproj
  16. 12 0
      test/Vitorm.File.RowMapToFile.MsTest/appsettings.json
  17. 39 0
      test/Vitorm.File.TableToDir.Data.MsTest/Vitorm.File.TableToDir.Data.MsTest.csproj
  18. 1 0
      test/Vitorm.File.TableToDir.Data.MsTest/appsettings.json
  19. 36 0
      test/Vitorm.File.TableToDir.MsTest/Vitorm.File.TableToDir.MsTest.csproj
  20. 12 0
      test/Vitorm.File.TableToDir.MsTest/appsettings.json
  21. 0 0
      test/Vitorm.File.TableToFile.Data.MsTest/CommonTest/Common_Test.cs
  22. 0 0
      test/Vitorm.File.TableToFile.Data.MsTest/CommonTest/UserTest.Entity.cs
  23. 0 0
      test/Vitorm.File.TableToFile.Data.MsTest/CommonTest/UserTest.cs
  24. 0 0
      test/Vitorm.File.TableToFile.Data.MsTest/CommonTest/UserTestAsync.cs
  25. 4 4
      test/Vitorm.File.TableToFile.Data.MsTest/Vitorm.File.TableToFile.Data.MsTest.csproj
  26. 12 0
      test/Vitorm.File.TableToFile.Data.MsTest/appsettings.json
  27. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/CRUDAsync_Test.cs
  28. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/CRUD_Test.cs
  29. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/ChangeDatabase_Test.cs
  30. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/ChangeTable_Test.cs
  31. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/EntityLoader_CustomLoader_Test.cs
  32. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/EntityLoader_Test.cs
  33. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_Bool_Test.cs
  34. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_DateTime_Test.cs
  35. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_Numeric_Calculate_Test.cs
  36. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_Numeric_Test.cs
  37. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_String_Calculate_Test.cs
  38. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_String_Like_Test.cs
  39. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_String_Test.cs
  40. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_Test.cs
  41. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Count_Test.cs
  42. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Distinct_Test.cs
  43. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_FilterRule_Test.cs
  44. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_FilterRule_WithJoin_Test.cs
  45. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Group_Test.cs
  46. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_InnerJoin_ByJoin_Test.cs
  47. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_InnerJoin_BySelectMany_Test.cs
  48. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_LeftJoin_ByGroupJoin_Test.cs
  49. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_LeftJoin_BySelectMany_Test.cs
  50. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Method_Test.cs
  51. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_ScopeParam_LeftJoin_Test.cs
  52. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_ScopeParam_Test.cs
  53. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Select_Test.cs
  54. 0 0
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Schema_Test.cs
  55. 10 2
      test/Vitorm.File.TableToFile.MsTest/CommonTest/Truncate_Test.cs
  56. 5 3
      test/Vitorm.File.TableToFile.MsTest/DataSource.cs
  57. 9 5
      test/Vitorm.File.TableToFile.MsTest/Vitorm.File.TableToFile.MsTest.csproj
  58. 12 0
      test/Vitorm.File.TableToFile.MsTest/appsettings.json

+ 10 - 4
README.md

@@ -15,10 +15,14 @@ Vitorm.File: an simple orm for File
 
 # How to store data
 
-connectionString    :    "xxx/{databaseName}"
-row                 :   "xxx/{databaseName}/{tableName}/{key}.json"
-
+mode: TableToDir
+    connectionString    :   "xxx/{{databaseName}}"
+    table               :   "xxx/{{databaseName}}/{{tableName}}"
+    row                 :   "xxx/{{databaseName}}/{{tableName}}/{{key}}.json"
 
+mode: TableToFile(default), RowMapToFile
+    connectionString    :   "xxx/{{databaseName}}"
+    table               :   "xxx/{{databaseName}}/{{tableName}}.json"
 
 
 
@@ -197,6 +201,7 @@ dotnet add package Vitorm.File
     "Data": [
       {
         "provider": "File",
+        "mode": "TableToFile",
         "namespace": "App",
         "connectionString": "Data/db_orm"
       }
@@ -309,7 +314,8 @@ namespace App
 
 
 # Examples:  
-[Test Example](https://github.com/Vit-Orm/Vitorm.File/tree/master/test/Vitorm.File.MsTest)    
+[Vitorm Example](https://github.com/Vit-Orm/Vitorm.File/tree/master/test/Vitorm.File.TableToFile.MsTest)    
+[Vitorm.Data Example](https://github.com/Vit-Orm/Vitorm.File/tree/master/test/Vitorm.File.Data.TableToFile.MsTest)    
 
 
 

+ 41 - 13
Vitorm.File.sln

@@ -6,7 +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\ReleaseLog.md = doc\ReleaseLog.md
+		doc\ReleaseNotes.md = doc\ReleaseNotes.md
 		doc\TODO.md = doc\TODO.md
 	EndProjectSection
 EndProject
@@ -19,9 +19,17 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{05176905-A2A
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vitorm.File", "src\Vitorm.File\Vitorm.File.csproj", "{7AC01F47-AD5A-4B61-9F05-38094C1EF23B}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vitorm.File.MsTest", "test\Vitorm.File.MsTest\Vitorm.File.MsTest.csproj", "{42E0FE60-9E3B-4B59-A69E-E50A20C89D6D}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vitorm.File.TableToDir.MsTest", "test\Vitorm.File.TableToDir.MsTest\Vitorm.File.TableToDir.MsTest.csproj", "{9680663A-153D-4A9A-AEEA-B19FC87387B2}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vitorm.File.Data.MsTest", "test\Vitorm.File.Data.MsTest\Vitorm.File.Data.MsTest.csproj", "{EB69697B-0CDB-4A28-AACF-22C31137DDE9}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vitorm.File.TableToFile.Data.MsTest", "test\Vitorm.File.TableToFile.Data.MsTest\Vitorm.File.TableToFile.Data.MsTest.csproj", "{8E09B825-1A18-4396-A511-36C223F89929}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vitorm.File.TableToFile.MsTest", "test\Vitorm.File.TableToFile.MsTest\Vitorm.File.TableToFile.MsTest.csproj", "{06FAF2EB-B9B4-48FE-BDC6-A23EF641810A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vitorm.File.TableToDir.Data.MsTest", "test\Vitorm.File.TableToDir.Data.MsTest\Vitorm.File.TableToDir.Data.MsTest.csproj", "{320C7A91-D550-45BE-AE91-88C048D66BC9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vitorm.File.RowMapToFile.Data.MsTest", "test\Vitorm.File.RowMapToFile.Data.MsTest\Vitorm.File.RowMapToFile.Data.MsTest.csproj", "{40485AE4-63B6-4343-96D1-368A260A369F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vitorm.File.RowMapToFile.MsTest", "test\Vitorm.File.RowMapToFile.MsTest\Vitorm.File.RowMapToFile.MsTest.csproj", "{ADAFA427-7133-4D5F-90A0-874D9338D4AF}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -33,22 +41,42 @@ Global
 		{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
-		{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
+		{9680663A-153D-4A9A-AEEA-B19FC87387B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9680663A-153D-4A9A-AEEA-B19FC87387B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9680663A-153D-4A9A-AEEA-B19FC87387B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9680663A-153D-4A9A-AEEA-B19FC87387B2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8E09B825-1A18-4396-A511-36C223F89929}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8E09B825-1A18-4396-A511-36C223F89929}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8E09B825-1A18-4396-A511-36C223F89929}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8E09B825-1A18-4396-A511-36C223F89929}.Release|Any CPU.Build.0 = Release|Any CPU
+		{06FAF2EB-B9B4-48FE-BDC6-A23EF641810A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{06FAF2EB-B9B4-48FE-BDC6-A23EF641810A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{06FAF2EB-B9B4-48FE-BDC6-A23EF641810A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{06FAF2EB-B9B4-48FE-BDC6-A23EF641810A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{320C7A91-D550-45BE-AE91-88C048D66BC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{320C7A91-D550-45BE-AE91-88C048D66BC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{320C7A91-D550-45BE-AE91-88C048D66BC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{320C7A91-D550-45BE-AE91-88C048D66BC9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{40485AE4-63B6-4343-96D1-368A260A369F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{40485AE4-63B6-4343-96D1-368A260A369F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{40485AE4-63B6-4343-96D1-368A260A369F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{40485AE4-63B6-4343-96D1-368A260A369F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{ADAFA427-7133-4D5F-90A0-874D9338D4AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ADAFA427-7133-4D5F-90A0-874D9338D4AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ADAFA427-7133-4D5F-90A0-874D9338D4AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ADAFA427-7133-4D5F-90A0-874D9338D4AF}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
 		{7AC01F47-AD5A-4B61-9F05-38094C1EF23B} = {05176905-A2A5-4015-9F04-2904506C902F}
-		{42E0FE60-9E3B-4B59-A69E-E50A20C89D6D} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
-		{EB69697B-0CDB-4A28-AACF-22C31137DDE9} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
+		{9680663A-153D-4A9A-AEEA-B19FC87387B2} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
+		{8E09B825-1A18-4396-A511-36C223F89929} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
+		{06FAF2EB-B9B4-48FE-BDC6-A23EF641810A} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
+		{320C7A91-D550-45BE-AE91-88C048D66BC9} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
+		{40485AE4-63B6-4343-96D1-368A260A369F} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
+		{ADAFA427-7133-4D5F-90A0-874D9338D4AF} = {7904FE51-04FF-4477-8E3A-CC340389EE32}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {C7DA16E3-9949-49FA-B0B4-F830636DE60F}

+ 0 - 1
doc/ReleaseLog.md

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

+ 7 - 0
doc/ReleaseNotes.md

@@ -0,0 +1,7 @@
+# Vitorm.File ReleaseNotes
+
+-----------------------
+# 2.2.0
+- support mode : TableToFile(default), RowMapToFile , TableToDir
+
+

+ 2 - 2
src/Versions.props

@@ -1,7 +1,7 @@
 <Project>
     <PropertyGroup>
-        <Version>2.2.0-preview2</Version>
-        <Vitorm_Version>[2.2.0-preview2, 2.3.0)</Vitorm_Version>
+        <Version>2.2.0</Version>
+        <Vitorm_Version>[2.2.0, 2.3.0)</Vitorm_Version>
     </PropertyGroup>
 
     <PropertyGroup>

+ 13 - 3
src/Vitorm.File/DbConfig.cs

@@ -11,9 +11,10 @@ namespace Vitorm.File
             this.connectionString = connectionString;
         }
 
-        public DbConfig(string connectionString, string readOnlyConnectionString)
+        public DbConfig(string connectionString, string mode)
         {
             this.connectionString = connectionString;
+            this.mode = mode;
         }
 
         public DbConfig(Dictionary<string, object> config)
@@ -21,10 +22,19 @@ namespace Vitorm.File
             object value;
             if (config.TryGetValue("connectionString", out value))
                 this.connectionString = value as string;
+
+
+            if (config.TryGetValue("mode", out value))
+                this.mode = value as string;
         }
 
         public string connectionString { get; set; }
 
+        /// <summary>
+        /// TableToFile(default), TableToDir , RowMapToFile
+        /// </summary>
+        public string mode { get; set; }
+
 
         public virtual string databaseName => Path.GetFileName(connectionString);
 
@@ -32,9 +42,9 @@ namespace Vitorm.File
         {
             var _connectionString = Path.Combine(Path.GetDirectoryName(connectionString), databaseName);
 
-            return new DbConfig(_connectionString);
+            return new DbConfig(_connectionString, mode);
         }
 
-        internal string dbHashCode => connectionString.GetHashCode().ToString();
+        internal string dbHashCode => (connectionString + (mode ?? "TableToFile")).GetHashCode().ToString();
     }
 }

+ 3 - 0
src/Vitorm.File/DbContext.cs

@@ -14,6 +14,9 @@ namespace Vitorm.File
         public DbContext(string connectionString) : this(new DbConfig(connectionString))
         {
         }
+        public DbContext(string connectionString, string mode) : this(new DbConfig(connectionString, mode))
+        {
+        }
 
 
         #region Transaction

+ 28 - 0
src/Vitorm.File/DbSetConstructor.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Reflection;
+
+using Vitorm.Entity;
+
+namespace Vitorm.File
+{
+    public class DbSetConstructor
+    {
+        public static IDbSet CreateDbSet(IDbContext dbContext, IEntityDescriptor entityDescriptor)
+        {
+            return _CreateDbSet.MakeGenericMethod(entityDescriptor.entityType, entityDescriptor.key?.type ?? typeof(string))
+                     .Invoke(null, new object[] { dbContext, entityDescriptor }) as IDbSet;
+        }
+
+        static readonly MethodInfo _CreateDbSet = new Func<DbContext, IEntityDescriptor, IDbSet>(CreateDbSet<object, string>)
+                   .Method.GetGenericMethodDefinition();
+        public static IDbSet<Entity> CreateDbSet<Entity, EntityKey>(DbContext dbContext, IEntityDescriptor entityDescriptor)
+        {
+            // TableToFile(default), TableToDir , RowMapToFile
+            if (dbContext.dbConfig.mode == "TableToDir") return new DbSet_TableToDir<Entity, EntityKey>(dbContext, entityDescriptor);
+            if (dbContext.dbConfig.mode == "RowMapToFile") return new DbSet_RowMapToFile<Entity, EntityKey>(dbContext, entityDescriptor);
+
+            return new DbSet_TableToFile<Entity, EntityKey>(dbContext, entityDescriptor);
+        }
+
+    }
+}

+ 33 - 0
src/Vitorm.File/DbSet_RowMapToFile.cs

@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using System.Linq;
+
+using Vit.Core.Module.Serialization;
+
+using Vitorm.Entity;
+
+namespace Vitorm.File
+{
+
+    public partial class DbSet_RowMapToFile<Entity, EntityKey> : DbSet_TableToFile<Entity, EntityKey>
+    {
+        public DbSet_RowMapToFile(DbContext dbContext, IEntityDescriptor entityDescriptor) : base(dbContext, entityDescriptor) { }
+
+        protected override IEnumerable<Entity> GetEntities()
+        {
+            if (!System.IO.File.Exists(tablePath)) return default;
+            var rows = Json.Deserialize<Dictionary<EntityKey, Dictionary<string, object>>>(System.IO.File.ReadAllText(tablePath));
+            return rows.Values.Select(FromJson);
+        }
+        protected override void SaveEntities(IEnumerable<Entity> entities)
+        {
+            string strContent = "{}";
+            if (entities != null)
+            {
+                var rowMap = entities.ToDictionary(entity => (EntityKey)entityDescriptor.key.GetValue(entity), ToJson);
+                strContent = Json.Serialize(rowMap);
+            }
+            System.IO.File.WriteAllText(tablePath, strContent);
+        }
+
+    }
+}

+ 18 - 28
src/Vitorm.File/DbSet.cs → src/Vitorm.File/DbSet_TableToDir.cs

@@ -2,7 +2,6 @@
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using System.Reflection;
 using System.Threading.Tasks;
 
 using Vit.Core.Module.Serialization;
@@ -12,25 +11,9 @@ using Vitorm.Entity;
 
 namespace Vitorm.File
 {
-    public class DbSetConstructor
-    {
-        public static IDbSet CreateDbSet(IDbContext dbContext, IEntityDescriptor entityDescriptor)
-        {
-            return _CreateDbSet.MakeGenericMethod(entityDescriptor.entityType)
-                     .Invoke(null, new object[] { dbContext, entityDescriptor }) as IDbSet;
-        }
-
-        static readonly MethodInfo _CreateDbSet = new Func<DbContext, IEntityDescriptor, IDbSet>(CreateDbSet<object>)
-                   .Method.GetGenericMethodDefinition();
-        public static IDbSet<Entity> CreateDbSet<Entity>(DbContext dbContext, IEntityDescriptor entityDescriptor)
-        {
-            return new DbSet<Entity>(dbContext, entityDescriptor);
-        }
-
-    }
 
 
-    public partial class DbSet<Entity> : IDbSet<Entity>
+    public partial class DbSet_TableToDir<Entity, EntityKey> : IDbSet<Entity>
     {
         public virtual IDbContext dbContext { get; protected set; }
         public virtual DbContext DbContext => (DbContext)dbContext;
@@ -40,7 +23,7 @@ namespace Vitorm.File
         public virtual IEntityDescriptor entityDescriptor => _entityDescriptor;
 
 
-        public DbSet(DbContext dbContext, IEntityDescriptor entityDescriptor)
+        public DbSet_TableToDir(DbContext dbContext, IEntityDescriptor entityDescriptor)
         {
             this.dbContext = dbContext;
             this._entityDescriptor = entityDescriptor;
@@ -63,23 +46,30 @@ namespace Vitorm.File
             return Path.Combine(DbContext.dbConfig.connectionString, entityDescriptor.tableName, key + ".json");
         }
 
-        protected virtual Entity GetEntityByPath(string path)
-        {
-            if (!System.IO.File.Exists(path)) return default;
 
+        protected virtual Entity FromJson(Dictionary<string, object> json)
+        {
             var entity = (Entity)Activator.CreateInstance(entityDescriptor.entityType);
-
-            var json = Json.Deserialize<Dictionary<string, object>>(System.IO.File.ReadAllText(path));
-
             entityDescriptor.allColumns.ForEach(col =>
             {
                 if (json.TryGetValue(col.columnName, out var value)) col.SetValue(entity, TypeUtil.ConvertToType(value, col.type));
             });
             return entity;
         }
+
+        protected virtual Entity GetEntityByPath(string path)
+        {
+            if (!System.IO.File.Exists(path)) return default;
+
+            var json = Json.Deserialize<Dictionary<string, object>>(System.IO.File.ReadAllText(path));
+
+            return FromJson(json);
+        }
         protected int GetMaxId()
         {
-            return tableDirectory.GetFiles()?.Max(f => int.TryParse(f.Name, out var id) ? id : 0) ?? 0;
+            var files = tableDirectory.GetFiles();
+            if (files?.Any() != true) return 0;
+            return files.Max(f => int.TryParse(f.Name, out var id) ? id : 0);
         }
 
         public static int RecursionDelete(DirectoryInfo directory)
@@ -107,7 +97,7 @@ namespace Vitorm.File
 
 
 
-        #region #0 Schema :  Create Drop
+        #region #0 Schema : Create Drop
 
         public virtual bool TableExist()
         {
@@ -145,7 +135,7 @@ namespace Vitorm.File
 
 
 
-        #region #1 Create :  Add AddRange
+        #region #1 Create : Add AddRange
         public virtual Entity Add(Entity entity)
         {
             object keyValue = entityDescriptor.key.GetValue(entity);

+ 294 - 0
src/Vitorm.File/DbSet_TableToFile.cs

@@ -0,0 +1,294 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+
+using Vit.Core.Module.Serialization;
+using Vit.Linq;
+
+using Vitorm.Entity;
+
+namespace Vitorm.File
+{
+
+    public partial class DbSet_TableToFile<Entity, EntityKey> : IDbSet<Entity>
+    {
+        public virtual IDbContext dbContext { get; protected set; }
+        public virtual DbContext DbContext => (DbContext)dbContext;
+
+
+        protected IEntityDescriptor _entityDescriptor;
+        public virtual IEntityDescriptor entityDescriptor => _entityDescriptor;
+
+
+        public DbSet_TableToFile(DbContext dbContext, IEntityDescriptor entityDescriptor)
+        {
+            this.dbContext = dbContext;
+            this._entityDescriptor = entityDescriptor;
+        }
+
+        // #0 Schema :  ChangeTable
+        public virtual IEntityDescriptor ChangeTable(string tableName) => _entityDescriptor = _entityDescriptor.WithTable(tableName);
+        public virtual IEntityDescriptor ChangeTableBack() => _entityDescriptor = _entityDescriptor.GetOriginEntityDescriptor();
+
+
+
+        #region  File Methods
+
+        public string tablePath => Path.Combine(DbContext.dbConfig.connectionString, entityDescriptor.tableName + ".json");
+
+
+        protected virtual Entity FromJson(Dictionary<string, object> json)
+        {
+            var entity = (Entity)Activator.CreateInstance(entityDescriptor.entityType);
+            entityDescriptor.allColumns.ForEach(col =>
+            {
+                if (json.TryGetValue(col.columnName, out var value)) col.SetValue(entity, TypeUtil.ConvertToType(value, col.type));
+            });
+            return entity;
+        }
+        protected virtual Dictionary<string, object> ToJson(Entity entity)
+        {
+            return entityDescriptor.allColumns.ToDictionary(col => col.columnName, col => col.GetValue(entity));
+        }
+
+
+        protected virtual IEnumerable<Entity> GetEntities()
+        {
+            if (!System.IO.File.Exists(tablePath)) return default;
+            var rows = Json.Deserialize<List<Dictionary<string, object>>>(System.IO.File.ReadAllText(tablePath));
+            return rows.Select(FromJson);
+        }
+        protected virtual void SaveEntities(IEnumerable<Entity> entities)
+        {
+            string strContent = "[]";
+            if (entities != null)
+            {
+                var jsonList = entities.Select(ToJson);
+                strContent = Json.Serialize(jsonList);
+            }
+            System.IO.File.WriteAllText(tablePath, strContent);
+        }
+
+
+
+        protected virtual int GetMaxId(IEnumerable<Entity> entities)
+        {
+            if (entities?.Any() != true) return 0;
+            return entities.Max(entity => int.TryParse(entityDescriptor.key.GetValue(entity)?.ToString(), out var id) ? id : 0);
+        }
+
+
+
+        protected virtual int RemoveEntities(List<Entity> entities, IEnumerable<Entity> entitiesToRemove)
+        {
+            var keys = entitiesToRemove.Select(entity => entityDescriptor.key.GetValue(entity));
+            return RemoveByKeys(entities, keys);
+        }
+
+
+        protected virtual int RemoveByKeys<Key>(List<Entity> entities, IEnumerable<Key> keys)
+        {
+            IEnumerable<EntityKey> entityKeys;
+            if (typeof(Key) == typeof(EntityKey))
+            {
+                entityKeys = (IEnumerable<EntityKey>)keys;
+            }
+            else
+            {
+                entityKeys = keys.Select(key => (EntityKey)TypeUtil.ConvertToType(key, typeof(EntityKey)));
+            }
+            return entities.RemoveAll(entity => entityKeys.Contains((EntityKey)entityDescriptor.key.GetValue(entity)));
+        }
+
+        #endregion
+
+
+
+        #region #0 Schema : Create Drop
+
+        public virtual bool TableExist()
+        {
+            return System.IO.File.Exists(tablePath);
+        }
+
+        public virtual void TryCreateTable()
+        {
+            if (TableExist()) return;
+            Directory.CreateDirectory(Path.GetDirectoryName(tablePath));
+            SaveEntities(null);
+        }
+        public virtual async Task TryCreateTableAsync() => TryCreateTable();
+
+
+        public virtual void TryDropTable()
+        {
+            if (!TableExist()) return;
+            System.IO.File.Delete(tablePath);
+        }
+        public virtual async Task TryDropTableAsync() => TryDropTable();
+
+
+        public virtual void Truncate()
+        {
+            System.IO.File.Delete(tablePath);
+            SaveEntities(null);
+        }
+
+        public virtual async Task TruncateAsync() => Truncate();
+
+        #endregion
+
+
+
+
+
+        #region #1 Create : Add AddRange
+        public virtual Entity Add(Entity entity)
+        {
+            AddRange(new[] { entity });
+            return entity;
+        }
+
+        public virtual async Task<Entity> AddAsync(Entity entity)
+        {
+            await AddRangeAsync(new[] { entity });
+            return entity;
+        }
+
+        public virtual void AddRange(IEnumerable<Entity> entities)
+        {
+            var entityList = Query().ToList();
+
+            var removedCount = RemoveEntities(entityList, entities);
+            if (removedCount > 0) throw new Exception("entity already exist");
+
+
+            #region generate identity key if needed
+            if (entityDescriptor.key.isIdentity)
+            {
+                int maxId = GetMaxId(entityList);
+
+                entities.ForEach(entity =>
+                {
+                    object keyValue = entityDescriptor.key.GetValue(entity);
+                    var keyIsEmpty = keyValue is null || keyValue.Equals(TypeUtil.DefaultValue(entityDescriptor.key.type));
+                    if (keyIsEmpty)
+                    {
+                        maxId++;
+                        entityDescriptor.key.SetValue(entity, maxId);
+                    }
+                });
+            }
+            #endregion
+
+            entityList.AddRange(entities);
+
+            SaveEntities(entityList);
+        }
+
+        public virtual async Task AddRangeAsync(IEnumerable<Entity> entities) => AddRange(entities);
+
+        #endregion
+
+
+        #region #2 Retrieve : Get Query
+
+        public virtual Entity Get(object keyValue)
+        {
+            var key = (EntityKey)TypeUtil.ConvertToType(keyValue, entityDescriptor.key.type);
+            return GetEntities().FirstOrDefault(entity => key.Equals((EntityKey)entityDescriptor.key.GetValue(entity)));
+        }
+
+        public virtual async Task<Entity> GetAsync(object keyValue) => Get(keyValue);
+
+
+        public virtual IQueryable<Entity> Query()
+        {
+            return GetEntities().AsQueryable();
+        }
+
+        #endregion
+
+
+        #region #3 Update: Update UpdateRange
+        public virtual int Update(Entity entity)
+        {
+            var count = Delete(entity);
+            if (count == 0) return 0;
+            Add(entity);
+            return 1;
+        }
+        public virtual async Task<int> UpdateAsync(Entity entity) => Update(entity);
+
+
+        public virtual int UpdateRange(IEnumerable<Entity> entities)
+        {
+            var entityList = Query().ToList();
+
+            bool EntitiesHaveSameKey(Entity entity1, Entity entity2)
+            {
+                var key1 = (EntityKey)entityDescriptor.key.GetValue(entity1);
+                var key2 = (EntityKey)entityDescriptor.key.GetValue(entity2);
+                return key1?.Equals(key2) == true;
+            }
+
+            var entitiesToUpdate =
+                   (from entityFromDb in entityList
+                    from entityToUpdate in entities.Where(entityToUpdate => EntitiesHaveSameKey(entityFromDb, entityToUpdate))
+                    select new { entityFromDb, entityToUpdate })
+                   .ToList();
+
+            var removedCount = entitiesToUpdate.Count;
+            if (removedCount == 0) return 0;
+
+            var entitiesToSave = entityList.Except(entitiesToUpdate.Select(m => m.entityFromDb)).Concat(entitiesToUpdate.Select(m => m.entityToUpdate));
+
+            SaveEntities(entitiesToSave);
+
+            return removedCount;
+        }
+        public virtual async Task<int> UpdateRangeAsync(IEnumerable<Entity> entities) => UpdateRange(entities);
+
+        #endregion
+
+
+        #region #4 Delete : Delete DeleteRange DeleteByKey DeleteByKeys
+
+        public virtual int Delete(Entity entity)
+        {
+            return DeleteByKey(entityDescriptor.key.GetValue(entity));
+        }
+        public virtual async Task<int> DeleteAsync(Entity entity) => Delete(entity);
+
+        public virtual int DeleteRange(IEnumerable<Entity> entities) => entities.Sum(entity => Delete(entity));
+        public virtual async Task<int> DeleteRangeAsync(IEnumerable<Entity> entities) => DeleteRange(entities);
+
+
+        public virtual int DeleteByKey(object keyValue)
+        {
+            return DeleteByKeys(new[] { keyValue });
+        }
+        public virtual async Task<int> DeleteByKeyAsync(object keyValue) => DeleteByKey(keyValue);
+
+
+
+        public virtual int DeleteByKeys<Key>(IEnumerable<Key> keys)
+        {
+            var entityList = Query().ToList();
+
+            var removedCount = RemoveByKeys(entityList, keys);
+            if (removedCount == 0) return 0;
+
+            SaveEntities(entityList);
+
+            return removedCount;
+        }
+        public virtual async Task<int> DeleteByKeysAsync<Key>(IEnumerable<Key> keys) => DeleteByKeys(keys);
+
+        #endregion
+
+
+    }
+}

+ 1 - 1
src/Vitorm.File/Vitorm.File.csproj

@@ -32,7 +32,7 @@
     </ItemGroup>
 
     <ItemGroup>
-        <PackageReference Include="Vit.Core" Version="2.2.0" />
+        <PackageReference Include="Vit.Core" Version="2.3.0" />
         <PackageReference Include="Vitorm" Version="$(Vitorm_Version)" />
     </ItemGroup>
 

+ 39 - 0
test/Vitorm.File.RowMapToFile.Data.MsTest/Vitorm.File.RowMapToFile.Data.MsTest.csproj

@@ -0,0 +1,39 @@
+<Project Sdk="Microsoft.NET.Sdk">
+    <Import Project="..\..\src\Versions.props" />
+
+    <PropertyGroup>
+        <test>MSTest</test>
+    </PropertyGroup>
+
+    <PropertyGroup>
+        <TargetFramework>net6.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+
+        <IsPackable>false</IsPackable>
+        <IsTestProject>true</IsTestProject>
+        <RootNamespace>Vitorm.MsTest</RootNamespace>
+    </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="Vitorm.Data" Version="$(Vitorm_Version)" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <ProjectReference Include="..\..\src\Vitorm.File\Vitorm.File.csproj" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <Compile Include="..\Vitorm.File.TableToFile.Data.MsTest\CommonTest\*.cs" Link="CommonTest\%(RecursiveDir)%(FileName)%(Extension)" />
+    </ItemGroup>
+    
+    <ItemGroup>
+        <None Update="appsettings.json">
+            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+        </None>
+    </ItemGroup>
+
+</Project>

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

@@ -0,0 +1,12 @@
+{
+  "Vitorm": {
+    "Data": [
+      {
+        "provider": "File",
+        "mode": "RowMapToFile",
+        "namespace": "Vitorm.MsTest",
+        "connectionString": "Data/db_orm"
+      }
+    ]
+  }
+}

+ 36 - 0
test/Vitorm.File.RowMapToFile.MsTest/Vitorm.File.RowMapToFile.MsTest.csproj

@@ -0,0 +1,36 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <test>MSTest</test>
+    </PropertyGroup>
+
+    <PropertyGroup>
+        <TargetFramework>net6.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <IsPackable>false</IsPackable>
+        <IsTestProject>true</IsTestProject>
+        <RootNamespace>Vitorm.MsTest</RootNamespace>
+    </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" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <ProjectReference Include="..\..\src\Vitorm.File\Vitorm.File.csproj" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <Compile Include="..\Vitorm.File.TableToFile.MsTest\CommonTest\*.cs" Link="CommonTest\%(RecursiveDir)%(FileName)%(Extension)" />
+        <Compile Include="..\Vitorm.File.TableToFile.MsTest\DataSource.cs" Link="DataSource.cs" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <None Update="appsettings.json">
+            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+        </None>
+    </ItemGroup>
+
+</Project>

+ 12 - 0
test/Vitorm.File.RowMapToFile.MsTest/appsettings.json

@@ -0,0 +1,12 @@
+{
+  "Vitorm": {
+    "Data": [
+      {
+        "provider": "File",
+        "mode": "RowMapToFile",
+        "namespace": "Vitorm.MsTest",
+        "connectionString": "Data/db_orm"
+      }
+    ]
+  }
+}

+ 39 - 0
test/Vitorm.File.TableToDir.Data.MsTest/Vitorm.File.TableToDir.Data.MsTest.csproj

@@ -0,0 +1,39 @@
+<Project Sdk="Microsoft.NET.Sdk">
+    <Import Project="..\..\src\Versions.props" />
+
+    <PropertyGroup>
+        <test>MSTest</test>
+    </PropertyGroup>
+
+    <PropertyGroup>
+        <TargetFramework>net6.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+
+        <IsPackable>false</IsPackable>
+        <IsTestProject>true</IsTestProject>
+        <RootNamespace>Vitorm.MsTest</RootNamespace>
+    </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="Vitorm.Data" Version="$(Vitorm_Version)" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <ProjectReference Include="..\..\src\Vitorm.File\Vitorm.File.csproj" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <Compile Include="..\Vitorm.File.TableToFile.Data.MsTest\CommonTest\*.cs" Link="CommonTest\%(RecursiveDir)%(FileName)%(Extension)" />
+    </ItemGroup>
+    
+    <ItemGroup>
+        <None Update="appsettings.json">
+            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+        </None>
+    </ItemGroup>
+
+</Project>

+ 1 - 0
test/Vitorm.File.Data.MsTest/appsettings.json → test/Vitorm.File.TableToDir.Data.MsTest/appsettings.json

@@ -3,6 +3,7 @@
     "Data": [
       {
         "provider": "File",
+        "mode": "TableToDir",
         "namespace": "Vitorm.MsTest",
         "connectionString": "Data/db_orm"
       }

+ 36 - 0
test/Vitorm.File.TableToDir.MsTest/Vitorm.File.TableToDir.MsTest.csproj

@@ -0,0 +1,36 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <test>MSTest</test>
+    </PropertyGroup>
+
+    <PropertyGroup>
+        <TargetFramework>net6.0</TargetFramework>
+        <ImplicitUsings>enable</ImplicitUsings>
+        <IsPackable>false</IsPackable>
+        <IsTestProject>true</IsTestProject>
+        <RootNamespace>Vitorm.MsTest</RootNamespace>
+    </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" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <ProjectReference Include="..\..\src\Vitorm.File\Vitorm.File.csproj" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <Compile Include="..\Vitorm.File.TableToFile.MsTest\CommonTest\*.cs" Link="CommonTest\%(RecursiveDir)%(FileName)%(Extension)" />
+        <Compile Include="..\Vitorm.File.TableToFile.MsTest\DataSource.cs" Link="DataSource.cs" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <None Update="appsettings.json">
+            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+        </None>
+    </ItemGroup>
+
+</Project>

+ 12 - 0
test/Vitorm.File.TableToDir.MsTest/appsettings.json

@@ -0,0 +1,12 @@
+{
+  "Vitorm": {
+    "Data": [
+      {
+        "provider": "File",
+        "mode": "TableToDir",
+        "namespace": "Vitorm.MsTest",
+        "connectionString": "Data/db_orm"
+      }
+    ]
+  }
+}

+ 0 - 0
test/Vitorm.File.Data.MsTest/CommonTest/Common_Test.cs → test/Vitorm.File.TableToFile.Data.MsTest/CommonTest/Common_Test.cs


+ 0 - 0
test/Vitorm.File.Data.MsTest/CommonTest/UserTest.Entity.cs → test/Vitorm.File.TableToFile.Data.MsTest/CommonTest/UserTest.Entity.cs


+ 0 - 0
test/Vitorm.File.Data.MsTest/CommonTest/UserTest.cs → test/Vitorm.File.TableToFile.Data.MsTest/CommonTest/UserTest.cs


+ 0 - 0
test/Vitorm.File.Data.MsTest/CommonTest/UserTestAsync.cs → test/Vitorm.File.TableToFile.Data.MsTest/CommonTest/UserTestAsync.cs


+ 4 - 4
test/Vitorm.File.Data.MsTest/Vitorm.File.Data.MsTest.csproj → test/Vitorm.File.TableToFile.Data.MsTest/Vitorm.File.TableToFile.Data.MsTest.csproj

@@ -15,11 +15,11 @@
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
-        <PackageReference Include="MSTest.TestAdapter" Version="3.5.2" />
-        <PackageReference Include="MSTest.TestFramework" Version="3.5.2" />
+        <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="Vitorm.Data" Version="$(Vitorm_Version)"  />
+        <PackageReference Include="Vitorm.Data" Version="$(Vitorm_Version)" />
     </ItemGroup>
 
     <ItemGroup>

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

@@ -0,0 +1,12 @@
+{
+  "Vitorm": {
+    "Data": [
+      {
+        "provider": "File",
+        "mode": "TableToFile",
+        "namespace": "Vitorm.MsTest",
+        "connectionString": "Data/db_orm"
+      }
+    ]
+  }
+}

+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/CRUDAsync_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/CRUDAsync_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/CRUD_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/CRUD_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/ChangeDatabase_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/ChangeDatabase_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/ChangeTable_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/ChangeTable_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/EntityLoader_CustomLoader_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/EntityLoader_CustomLoader_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/EntityLoader_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/EntityLoader_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Property_Bool_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_Bool_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Property_DateTime_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_DateTime_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Property_Numeric_Calculate_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_Numeric_Calculate_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Property_Numeric_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_Numeric_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Property_String_Calculate_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_String_Calculate_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Property_String_Like_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_String_Like_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Property_String_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_String_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Property_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Property_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_Count_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Count_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_Distinct_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Distinct_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_FilterRule_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_FilterRule_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_FilterRule_WithJoin_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_FilterRule_WithJoin_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_Group_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Group_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_InnerJoin_ByJoin_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_InnerJoin_ByJoin_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_InnerJoin_BySelectMany_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_InnerJoin_BySelectMany_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_LeftJoin_ByGroupJoin_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_LeftJoin_ByGroupJoin_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_LeftJoin_BySelectMany_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_LeftJoin_BySelectMany_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_Method_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Method_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_ScopeParam_LeftJoin_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_ScopeParam_LeftJoin_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_ScopeParam_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_ScopeParam_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Query_Select_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Query_Select_Test.cs


+ 0 - 0
test/Vitorm.File.MsTest/CommonTest/Schema_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Schema_Test.cs


+ 10 - 2
test/Vitorm.File.MsTest/CommonTest/Truncate_Test.cs → test/Vitorm.File.TableToFile.MsTest/CommonTest/Truncate_Test.cs

@@ -18,14 +18,22 @@ namespace Vitorm.MsTest.CommonTest
             }
 
             dbContext.Truncate<User>();
-
             DataSource.WaitForUpdate();
-
             // assert
             {
                 var count = dbContext.Query<User>().Count();
                 Assert.AreEqual(0, count);
             }
+
+            dbContext.Add(User.NewUser(1, forAdd: true));
+            DataSource.WaitForUpdate();
+            // assert
+            {
+                var users = dbContext.Query<User>().ToList();
+                Assert.AreEqual(1, users.Count);
+                Assert.AreEqual(1, users[0].id);
+            }
+
         }
 
 

+ 5 - 3
test/Vitorm.File.MsTest/DataSource.cs → test/Vitorm.File.TableToFile.MsTest/DataSource.cs

@@ -1,5 +1,7 @@
 namespace Vitorm.MsTest
 {
+    using Vit.Core.Util.ConfigurationManager;
+
     using DbContext = Vitorm.File.DbContext;
 
     [System.ComponentModel.DataAnnotations.Schema.Table("User")]
@@ -59,10 +61,10 @@
         public static DbContext CreateDbContextForWriting(bool autoInit = true) => CreateDbContext(autoInit);
         public static DbContext CreateDbContext(bool autoInit = true)
         {
-            var guid = Guid.NewGuid().ToString();
-            var filePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Data", $"{guid}");
+            string connectionString = Appsettings.json.GetStringByPath("Vitorm.Data[0].connectionString");
+            string mode = Appsettings.json.GetStringByPath("Vitorm.Data[0].mode");
 
-            var dbContext = new Vitorm.File.DbContext(filePath);
+            var dbContext = new Vitorm.File.DbContext(connectionString, mode);
 
             if (autoInit)
                 InitDbContext(dbContext);

+ 9 - 5
test/Vitorm.File.MsTest/Vitorm.File.MsTest.csproj → test/Vitorm.File.TableToFile.MsTest/Vitorm.File.TableToFile.MsTest.csproj

@@ -14,15 +14,19 @@
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" />
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
-        <PackageReference Include="MSTest.TestAdapter" Version="3.5.2" />
-        <PackageReference Include="MSTest.TestFramework" Version="3.5.2" />
+        <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" />
+    </ItemGroup>
 
+    <ItemGroup>
+        <ProjectReference Include="..\..\src\Vitorm.File\Vitorm.File.csproj" />
     </ItemGroup>
 
     <ItemGroup>
-      <ProjectReference Include="..\..\src\Vitorm.File\Vitorm.File.csproj" />
+        <None Update="appsettings.json">
+            <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+        </None>
     </ItemGroup>
 
 </Project>

+ 12 - 0
test/Vitorm.File.TableToFile.MsTest/appsettings.json

@@ -0,0 +1,12 @@
+{
+  "Vitorm": {
+    "Data": [
+      {
+        "provider": "File",
+        "mode": "TableToFile",
+        "namespace": "Vitorm.MsTest",
+        "connectionString": "Data/db_orm"
+      }
+    ]
+  }
+}