protected static bool MappingData <T>(T value, DxGrvObj obj) where T : BaseModel2
        {
            foreach (JToken attribute in obj.Data)
            {
                JProperty jProperty    = attribute.ToObject <JProperty>();
                string    propertyName = jProperty.Name;

                var prop = value.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance);
                if (null != prop && prop.CanWrite)
                {
                    prop.SetValue(value, jProperty.Value.ToObject(prop.PropertyType));
                }
            }
            return(true);
        }
        public static async Task <ApiResponseBase> HandleEdit <T>(ApplicationDbContext context, DxGrvObj obj, bool autoSave = false) where T : BaseModel2
        {
            var respone = new ApiResponseBase();
            var repo    = context.Set <T>();

            switch (obj.EditType)
            {
            case DxGrvEditType.Insert:
                try
                {
                    var dbInsert = await repo.FirstOrDefaultAsync <T>(p => p.Id == obj.Key);

                    if (dbInsert == null)
                    {
                        dbInsert          = Activator.CreateInstance <T>();
                        dbInsert.CRUDDate = DateTime.Now;
                        MappingData <T>(dbInsert, obj);
                        await repo.AddAsync(dbInsert);

                        respone.MakeTrue("Thêm mới thành công");
                    }
                }
                catch (Exception ex)
                {
                    respone.MakeException(ex);
                }

                break;

            case DxGrvEditType.Update:
                try
                {
                    var dbUpdateObj = await repo.FirstOrDefaultAsync <T>(p => p.Id == obj.Key);

                    dbUpdateObj.CRUDDate = DateTime.Now;
                    MappingData <T>(dbUpdateObj, obj);
                    repo.Update(dbUpdateObj);
                    respone.MakeTrue("Cập nhật thành công");
                }
                catch (Exception ex)
                {
                    respone.MakeException(ex);
                }
                break;

            case DxGrvEditType.Delete:
                try
                {
                    var dbDeleteObj = await repo.FirstOrDefaultAsync <T>(p => p.Id == obj.Key);

                    MappingData <T>(dbDeleteObj, obj);
                    repo.Remove(dbDeleteObj);
                    respone.MakeTrue("Đã xóa!");
                }
                catch (Exception ex)
                {
                    respone.MakeException(ex);
                }
                break;
            }

            if (autoSave)
            {
                await context.SaveChangesAsync();
            }

            return(respone);
        }