Bläddra i källkod

Merge pull request #4 from LithWang/master

2.2.0
Lith 7 månader sedan
förälder
incheckning
a4993c6271

+ 1 - 1
Vitorm.Excel.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

+ 0 - 1
doc/ReleaseLog.md

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

+ 6 - 0
doc/ReleaseNotes.md

@@ -0,0 +1,6 @@
+# Vitorm.Excel ReleaseNotes
+
+-----------------------
+# 2.2.0
+
+- support identity key

+ 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>

+ 68 - 72
src/Vitorm.Excel/DbSet.cs

@@ -22,21 +22,21 @@ namespace Vitorm.Excel
     {
         public static IDbSet CreateDbSet(IDbContext dbContext, IEntityDescriptor entityDescriptor)
         {
-            return _CreateDbSet.MakeGenericMethod(entityDescriptor.entityType)
+            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>)
+        static readonly MethodInfo _CreateDbSet = new Func<DbContext, IEntityDescriptor, IDbSet>(CreateDbSet<object, string>)
                    .Method.GetGenericMethodDefinition();
-        public static IDbSet<Entity> CreateDbSet<Entity>(DbContext dbContext, IEntityDescriptor entityDescriptor)
+        public static IDbSet<Entity> CreateDbSet<Entity, EntityKey>(DbContext dbContext, IEntityDescriptor entityDescriptor)
         {
-            return new DbSet<Entity>(dbContext, entityDescriptor);
+            return new DbSet<Entity, EntityKey>(dbContext, entityDescriptor);
         }
 
     }
 
 
-    public partial class DbSet<Entity> : IDbSet<Entity>
+    public partial class DbSet<Entity, EntityKey> : IDbSet<Entity>
     {
         public virtual IDbContext dbContext { get; protected set; }
         public virtual DbContext DbContext => (DbContext)dbContext;
@@ -90,6 +90,14 @@ namespace Vitorm.Excel
 
 
 
+        protected virtual int GetMaxId()
+        {
+            var entities = GetEntities().Select(m => m.entity);
+            if (entities?.Any() != true) return 0;
+            return entities.Max(entity => int.TryParse(entityDescriptor.key.GetValue(entity)?.ToString(), out var id) ? id : 0);
+        }
+
+
         public virtual void AddColumnsIfNotExist()
         {
             var colsToAdd = entityDescriptor.allColumns.Where(col => !columnIndexes.TryGetValue(col.columnName, out var _)).ToList();
@@ -121,14 +129,7 @@ namespace Vitorm.Excel
             }
         }
 
-        protected virtual int UpdateRangeWithoutSave(IEnumerable<Entity> entities)
-        {
-            var method = (new Func<IEnumerable<Entity>, int>(UpdateRangeWithoutSave<string>))
-                          .GetMethodInfo()
-                          .GetGenericMethodDefinition().MakeGenericMethod(entityDescriptor.key.type);
 
-            return (int)method.Invoke(this, new object[] { entities });
-        }
         protected virtual void SetRow(Entity entity, int rowIndex)
         {
             foreach (var col in entityDescriptor.allColumns)
@@ -138,53 +139,19 @@ namespace Vitorm.Excel
                 sheet.SetValue(rowIndex, colIndex, value);
             }
         }
-        protected virtual int DeleteByKeyWithoutSave(object keyValue)
-        {
-            var method = (new Func<string, int>(DeleteByKeyWithoutSave<string>))
-                          .GetMethodInfo()
-                          .GetGenericMethodDefinition().MakeGenericMethod(entityDescriptor.key.type);
 
-            return (int)method.Invoke(this, new object[] { keyValue });
-        }
-        protected virtual int DeleteByKeyWithoutSave<Key>(Key keyValue)
+        protected virtual int DeleteByKeysWithoutSave<Key>(IEnumerable<Key> keys)
         {
-            int colIndex = columnIndexes.TryGetValue(entityDescriptor.key.columnName, out var i) ? i : throw new ArgumentOutOfRangeException("key column not exist.");
-
-            var lastRowIndex = sheet.Dimension.End.Row;
-
-            int count = 0;
-            for (var rowIndex = lastRowIndex; rowIndex >= 2; rowIndex--)
+            IEnumerable<EntityKey> entityKeys;
+            if (typeof(Key) == typeof(EntityKey))
             {
-                var key = (Key)TypeUtil.ConvertToType(sheet.GetValue(rowIndex, colIndex), typeof(Key));
-                if (keyValue?.Equals(key) == true)
-                {
-                    sheet.DeleteRow(rowIndex);
-                    count++;
-                }
+                entityKeys = (IEnumerable<EntityKey>)keys;
+            }
+            else
+            {
+                entityKeys = keys.Select(key => (EntityKey)TypeUtil.ConvertToType(key, typeof(EntityKey)));
             }
-            return count;
-        }
-
-
-        protected virtual int DeleteByKeysWithoutSave<Key>(IEnumerable<Key> keys)
-        {
-            var method = (new Func<IEnumerable<string>, int>(DeleteByKeys_<string, int>))
-                        .GetMethodInfo()
-                        .GetGenericMethodDefinition().MakeGenericMethod(typeof(Key), entityDescriptor.key.type);
-
-            return (int)method.Invoke(this, new object[] { keys });
-        }
-
-        protected virtual int DeleteByKeys_<Key, EntityKey>(IEnumerable<Key> keys)
-        {
-            if (typeof(Key) == typeof(EntityKey)) return DeleteByKeysWithoutSave(keys);
-
-            var entityKeys = keys.Select(key => (EntityKey)TypeUtil.ConvertToType(key, typeof(EntityKey)));
-            return DeleteByKeys_(entityKeys);
-        }
 
-        protected virtual int DeleteByKeys_<Key>(IEnumerable<Key> keys)
-        {
             int colIndex = columnIndexes.TryGetValue(entityDescriptor.key.columnName, out var i) ? i : throw new ArgumentOutOfRangeException("key column not exist.");
 
             var lastRowIndex = sheet.Dimension.End.Row;
@@ -192,8 +159,8 @@ namespace Vitorm.Excel
             int count = 0;
             for (var rowIndex = lastRowIndex; rowIndex >= 2; rowIndex--)
             {
-                var key = (Key)TypeUtil.ConvertToType(sheet.GetValue(rowIndex, colIndex), typeof(Key));
-                if (keys.Contains(key))
+                var key = (EntityKey)TypeUtil.ConvertToType(sheet.GetValue(rowIndex, colIndex), typeof(EntityKey));
+                if (entityKeys.Contains(key))
                 {
                     sheet.DeleteRow(rowIndex);
                     count++;
@@ -358,6 +325,26 @@ namespace Vitorm.Excel
         {
             AddColumnsIfNotExist();
 
+
+            #region generate identity key if needed
+            if (entityDescriptor.key.isIdentity)
+            {
+                int maxId = GetMaxId();
+
+                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
+
+
             var lastRowIndex = sheet.Dimension?.End.Row ?? 0;
             var range = sheet.Cells[lastRowIndex + 1, 1];
 
@@ -379,6 +366,26 @@ namespace Vitorm.Excel
         {
             AddColumnsIfNotExist();
 
+
+            #region generate identity key if needed
+            if (entityDescriptor.key.isIdentity)
+            {
+                int maxId = GetMaxId();
+
+                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
+
+
             var lastRowIndex = sheet.Dimension?.End.Row ?? 0;
             var range = sheet.Cells[lastRowIndex + 1, 1];
 
@@ -472,14 +479,13 @@ namespace Vitorm.Excel
         }
 
 
-        protected int UpdateRangeWithoutSave<Key>(IEnumerable<Entity> entities)
+        protected virtual int UpdateRangeWithoutSave(IEnumerable<Entity> entities)
         {
-
             AddColumnsIfNotExist();
 
             // key -> entity
             var entityMap =
-                 entities.Select(entity => (key: (Key)entityDescriptor.key.GetValue(entity), entity: entity))
+                 entities.Select(entity => (key: (EntityKey)entityDescriptor.key.GetValue(entity), entity: entity))
                  .GroupBy(item => item.key).Select(group => (key: group.Key, entity: group.Last().entity))
                  .ToDictionary(item => item.key, item => item.entity);
 
@@ -487,7 +493,7 @@ namespace Vitorm.Excel
             foreach (var item in GetEntities())
             {
                 var oldEntity = item.entity;
-                var key = (Key)entityDescriptor.key.GetValue(oldEntity);
+                var key = (EntityKey)entityDescriptor.key.GetValue(oldEntity);
                 if (!entityMap.TryGetValue(key, out var entity)) continue;
 
                 var rowIndex = item.rowIndex;
@@ -527,18 +533,8 @@ namespace Vitorm.Excel
         }
 
 
-        public virtual int DeleteByKey(object keyValue)
-        {
-            int count = DeleteByKeyWithoutSave(keyValue);
-            Save();
-            return count;
-        }
-        public virtual async Task<int> DeleteByKeyAsync(object keyValue)
-        {
-            int count = DeleteByKeyWithoutSave(keyValue);
-            await SaveAsync();
-            return count;
-        }
+        public virtual int DeleteByKey(object keyValue) => DeleteByKeys(new[] { keyValue });
+        public virtual Task<int> DeleteByKeyAsync(object keyValue) => DeleteByKeysAsync(new[] { keyValue });
 
 
 

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

@@ -32,7 +32,7 @@
     </ItemGroup>
 
     <ItemGroup>
-        <PackageReference Include="EPPlus" Version="7.3.2" />
+        <PackageReference Include="EPPlus" Version="7.4.1" />
         <PackageReference Include="Vitorm" Version="$(Vitorm_Version)" />
     </ItemGroup>
 

+ 5 - 5
test/Vitorm.Excel.Data.MsTest/Vitorm.Excel.Data.MsTest.csproj

@@ -15,12 +15,12 @@
     </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="Vit.Core" Version="2.2.0" />
-        <PackageReference Include="Vitorm.Data" Version="$(Vitorm_Version)"  />
+        <PackageReference Include="Vit.Core" Version="2.3.0" />
+        <PackageReference Include="Vitorm.Data" Version="$(Vitorm_Version)" />
     </ItemGroup>
 
     <ItemGroup>

+ 10 - 2
test/Vitorm.Excel.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);
+            }
+
         }
 
 

+ 13 - 9
test/Vitorm.Excel.MsTest/DataSource.cs

@@ -13,6 +13,7 @@
 
         [System.ComponentModel.DataAnnotations.Key]
         [System.ComponentModel.DataAnnotations.Schema.Column("userId")]
+        [System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
         public int id { get; set; }
         [System.ComponentModel.DataAnnotations.Schema.Column("userName")]
         public string name { get; set; }
@@ -28,7 +29,7 @@
         [System.ComponentModel.DataAnnotations.Schema.NotMapped]
         public string test { get; set; }
 
-        public static User NewUser(int id, bool forAdd = false) => new User { id = id, name = "testUser" + id };
+        public static User NewUser(int id, bool forAdd = false) => new User { id = forAdd ? 0 : id, name = "testUser" + id };
 
         public static List<User> NewUsers(int startId, int count = 1, bool forAdd = false)
         {
@@ -41,13 +42,14 @@
     {
         [System.ComponentModel.DataAnnotations.Key]
         [System.ComponentModel.DataAnnotations.Schema.Column("classId")]
+        [System.ComponentModel.DataAnnotations.Schema.DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
         public int id { get; set; }
         [System.ComponentModel.DataAnnotations.Schema.Column("className")]
         public string name { get; set; }
 
         public static List<UserClass> NewClasses(int startId, int count = 1)
         {
-            return Enumerable.Range(startId, count).Select(id => new UserClass { id = id, name = "class" + id }).ToList();
+            return Enumerable.Range(startId, count).Select(id => new UserClass { id = 0, name = "class" + id }).ToList();
         }
     }
 
@@ -82,20 +84,22 @@
                 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" },
+                    new User { name="u146", fatherId=4, motherId=6 },
+                    new User { name="u246", fatherId=4, motherId=6 },
+                    new User { name="u356", fatherId=5, motherId=6 },
+                    new User { name="u400" },
+                    new User { name="u500" },
+                    new User { name="u600" },
                 };
+                dbContext.AddRange(users);
+
                 users.ForEach(user =>
                 {
                     user.birth = DateTime.Parse("2021-01-01 00:00:00").AddHours(user.id);
                     user.classId = user.id % 2 + 1;
                 });
 
-                dbContext.AddRange(users);
+                dbContext.UpdateRange(users);
             }
             #endregion
 

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

@@ -15,11 +15,11 @@
 
     <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" />
 
-        <PackageReference Include="Vit.Core" Version="2.2.0" />
+        <PackageReference Include="Vit.Core" Version="2.3.0" />
     </ItemGroup>
 
     <ItemGroup>