/// <summary>
        /// Ensure configuration is correct on both server and client side
        /// </summary>
        public virtual async Task <(SyncContext, DmSet)> EnsureSchemaAsync(SyncContext context, MessageEnsureSchema message)
        {
            try
            {
                context.SyncStage = SyncStage.SchemaApplying;

                using (var connection = this.CreateConnection())
                {
                    await connection.OpenAsync();

                    using (var transaction = connection.BeginTransaction())
                    {
                        // Raise event before
                        context.SyncStage = SyncStage.SchemaApplying;
                        var beforeArgs2 = new SchemaApplyingEventArgs(this.ProviderTypeName, context.SyncStage, message.Schema, connection, transaction);
                        this.TryRaiseProgressEvent(beforeArgs2, this.SchemaApplying);
                        var overWriteConfiguration = beforeArgs2.OverwriteConfiguration;

                        // if we dont have already read the tables || we want to overwrite the current config
                        if (message.Schema.HasTables && !message.Schema.HasColumns)
                        {
                            await this.ReadSchemaAsync(message.Schema, connection, transaction);
                        }

                        context.SyncStage = SyncStage.SchemaApplied;
                        var afterArgs = new SchemaAppliedEventArgs(this.ProviderTypeName, context.SyncStage, message.Schema, connection, transaction);
                        this.TryRaiseProgressEvent(afterArgs, this.SchemaApplied);

                        transaction.Commit();
                    }

                    connection.Close();
                }



                return(context, message.Schema);
            }
            catch (SyncException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new SyncException(ex, SyncStage.SchemaApplying, this.ProviderTypeName);
            }
        }
        /// <summary>
        /// Ensure configuration is correct on both server and client side
        /// </summary>
        public virtual async Task <(SyncContext, DmSet)> EnsureSchemaAsync(SyncContext context, MessageEnsureSchema message)
        {
            try
            {
                context.SyncStage = SyncStage.SchemaApplying;

                // Get cache manager and try to get configuration from cache
                //var cacheManager = this.CacheManager;

                //// if we don't pass config object (configuration == null), we may be in proxy mode, so the config object is handled by a local configuration object.
                //if (syncConfiguration == null && this.syncConfiguration == null)
                //    throw new ArgumentNullException("syncConfiguration", "You try to set a provider with no configuration object");

                //// the configuration has been set from the proxy server itself, use it.
                //if (syncConfiguration == null && this.syncConfiguration != null)
                //    syncConfiguration = this.syncConfiguration;

                // Raise event before
                context.SyncStage = SyncStage.SchemaApplying;
                var beforeArgs2 = new SchemaApplyingEventArgs(this.ProviderTypeName, context.SyncStage, message.Schema);
                this.TryRaiseProgressEvent(beforeArgs2, this.SchemaApplying);
                bool overWriteConfiguration = beforeArgs2.OverwriteConfiguration;


                // if we dont have already read the tables || we want to overwrite the current config
                if ((message.Schema.HasTables && !message.Schema.HasColumns))
                {
                    await this.ReadSchemaAsync(message.Schema);
                }

                context.SyncStage = SyncStage.SchemaApplied;
                var afterArgs = new SchemaAppliedEventArgs(this.ProviderTypeName, context.SyncStage, message.Schema);
                this.TryRaiseProgressEvent(afterArgs, this.SchemaApplied);

                return(context, message.Schema);
            }
            catch (SyncException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new SyncException(ex, SyncStage.SchemaApplying, this.ProviderTypeName);
            }
        }