// SaveState wipes out graph but keeps DatabaseObjects because: // TODO: We could try updating modified vertices only. public void SaveState(DatabaseObjectsGraph dg) { DatabaseObject[] symbolTable = dg.CreateMemento().State; int[][] jaggedArray = dg.Digraph.CreateMemento().State; // Save using (var ctx = new DependencyGraphContext(_connectionString)) { ctx.Database.ExecuteSqlCommand("TRUNCATE TABLE DatabaseObjectsGraph;"); foreach (var databaseObject in symbolTable) { switch (databaseObject.ObjectState) { case ObjectState.VertexAdded: var sqlStorageDatabaseObject = _engine.Map <SqlStorage.DatabaseObject>(databaseObject); ctx.DatabaseObjects.Add(sqlStorageDatabaseObject); break; case ObjectState.PropertiesModified: // Properties can be addedd, deleted or change values var objectInDatabase = ctx.DatabaseObjects.SingleOrDefault(f => f.FullyQualifiedName == databaseObject.FullyQualifiedName); if (objectInDatabase == null) { // We can't add a property to an object that hasn't been saved yet. throw new ArgumentException(nameof(objectInDatabase)); } objectInDatabase.Properties.Clear(); foreach (var property in databaseObject.Properties) { objectInDatabase.Properties.Add(DatabaseObjectConverter.Convert(property)); } ctx.Entry(objectInDatabase).State = EntityState.Modified; break; } } for (int i = 0; i < jaggedArray.Length; i++) { var json = JsonConvert.SerializeObject(jaggedArray[i]); ctx.DatabaseObjectVertices.Add(new DatabaseObjectVertex() { VertexId = i, AdjacencyListJson = json }); } ctx.SaveChanges(); } }