/// <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()'"); } }