/// <summary>
        ///     Clear all tables from the effort connection and ChangeTracker entries.
        /// </summary>
        public void ClearTables(DbContext context)
        {
            if (this.DbContainer != null)
            {
                ActionContext actionContext = new ActionContext(this.DbContainer);

                var tables = DbCommandActionHelper.GetAllTables(actionContext.DbContainer).ToList().Where(x => !x.EntityType.Name.Contains("_____MigrationHistory")).ToList();

                foreach (var table in tables)
                {
                    foreach (var index in table.Indexes)
                    {
                        index.Clear();
                    }

                    var _restoreIdentityFieldMethod = table.GetType().GetMethod("RestoreIdentityField", BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy);

                    if (_restoreIdentityFieldMethod != null)
                    {
                        _restoreIdentityFieldMethod.Invoke(table, new object[0]);
                    }
                }

                if (context != null)
                {
                    var changedEntriesCopy = context.ChangeTracker.Entries().ToList();
                    changedEntriesCopy.ForEach(x => x.State = EntityState.Detached);
                }
            }
        }
        /// <summary>
        ///    Create a restore point of the database
        /// </summary>
        public void CreateRestorePoint()
        {
            this.RestorePoint = new EffortRestorePoint(this);

            if (this.DbContainer != null)
            {
                ActionContext actionContext = new ActionContext(this.DbContainer);

                var tables = DbCommandActionHelper.GetAllTables(actionContext.DbContainer).ToList()
                             .Where(x => !x.EntityType.Name.Contains("_____MigrationHistory")).ToList();

                foreach (var table in tables)
                {
                    var index = table.PrimaryKeyIndex;

                    var uniqueDataStructureField = index.GetType().GetField("uniqueDataStructure", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                    var uniqueDataStructure      = uniqueDataStructureField.GetValue(index);

                    var innerField = uniqueDataStructure.GetType().GetField("inner", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                    var inner      = (IDictionary)innerField.GetValue(uniqueDataStructure);

                    var entities = inner.Values;
                    var list     = new List <object>();

                    foreach (var entity in entities)
                    {
                        list.Add(entity);
                    }

                    this.RestorePoint.AddToIndex(table, list);
                }
            }
            else
            {
                throw new Exception("The connection must be open to create a restore point. Please open the connection first with 'effortConnection.Open()'");
            }
        }