private void DeleteFromDatabase(DiagramItem wholeDiagramToAdjust, SelectableDesignerItemViewModelBase itemToDelete)
        {
            if (itemToDelete is BatteryViewModel)
            {
                DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(BatteryDesignerItem));
                wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent);
                _databaseAccessService.DeleteDesignerItem<BatteryDesignerItem>(itemToDelete.Id);
            }
            if (itemToDelete is ResistorViewModel)
            {
                DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(ResistorDesignerItem));
                wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent);
                _databaseAccessService.DeleteDesignerItem<ResistorDesignerItem>(itemToDelete.Id);
            }
            if (itemToDelete is LightBulbViewModel)
            {
                DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(LightBulbDesignerItem));
                wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent);
                _databaseAccessService.DeleteDesignerItem<LightBulbDesignerItem>(itemToDelete.Id);
            }
            if (itemToDelete is SwitchViewModel)
            {
                DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(SwitchDesignerItem));
                wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent);
                _databaseAccessService.DeleteDesignerItem<SwitchDesignerItem>(itemToDelete.Id);
            }
            if (itemToDelete is VoltmeterViewModel)
            {
                DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(VoltmeterDesignerItem));
                wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent);
                _databaseAccessService.DeleteDesignerItem<VoltmeterDesignerItem>(itemToDelete.Id);
            }
            if (itemToDelete is AmmeterViewModel)
            {
                DiagramItemData diagramItemToRemoveFromParent = wholeDiagramToAdjust.DesignerItems.Single(x => x.ItemId == itemToDelete.Id && x.ItemType == typeof(AmmeterDesignerItem));
                wholeDiagramToAdjust.DesignerItems.Remove(diagramItemToRemoveFromParent);
                _databaseAccessService.DeleteDesignerItem<AmmeterDesignerItem>(itemToDelete.Id);
            }
            if (itemToDelete is ConnectorViewModel)
            {
                wholeDiagramToAdjust.ConnectionIds.Remove(itemToDelete.Id);
                _databaseAccessService.DeleteConnection(itemToDelete.Id);
            }

            _databaseAccessService.SaveDiagram(wholeDiagramToAdjust);
        }
        private void ExecuteSaveDiagramCommand(object parameter)
        {
            if (!DiagramViewModel.Items.Any())
            {
                MessageBox.Show("There is nothing to save!", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            IsBusy = true;
            DiagramItem wholeDiagramToSave;

            Task<int> task = Task.Factory.StartNew(() =>
                {
                    if (SavedDiagramId != null)
                    {
                        int currentSavedDiagramId = SavedDiagramId.Value;
                        wholeDiagramToSave = _databaseAccessService.FetchDiagram(currentSavedDiagramId);
                        
                        //Clear all removed items that the user deleted as part of this work sesssion
                        foreach (var itemToRemove in _itemsToRemove)
                        {
                            DeleteFromDatabase(wholeDiagramToSave, itemToRemove);
                        }

                        // Start with empty collections of connections and items, which will be populated based on current diagram
                        wholeDiagramToSave.ConnectionIds = new List<int>();
                        wholeDiagramToSave.DesignerItems = new List<DiagramItemData>();
                    }
                    else
                    {
                        wholeDiagramToSave = new DiagramItem();
                    }

                    // Ensure that itemsToRemove is cleared ready for any new changes within a session
                    _itemsToRemove = new List<SelectableDesignerItemViewModelBase>();

                    foreach (var model in DiagramViewModel.Items.OfType<BatteryViewModel>())
                    {
                        BatteryDesignerItem item = new BatteryDesignerItem(model.Id, model.Left, model.Top, model.Component.VoltageSource);
                        model.Id = _databaseAccessService.SaveDesignerItem(item);
                        wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(BatteryDesignerItem)));
                    }
                    foreach (var model in DiagramViewModel.Items.OfType<ResistorViewModel>())
                    {
                        ResistorDesignerItem item = new ResistorDesignerItem(model.Id, model.Left, model.Top, model.Component.Resistance);
                        model.Id = _databaseAccessService.SaveDesignerItem(item);
                        wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(ResistorDesignerItem)));
                    }
                    foreach (var model in DiagramViewModel.Items.OfType<LightBulbViewModel>())
                    {
                        LightBulbDesignerItem item = new LightBulbDesignerItem(model.Id, model.Left, model.Top, model.Component.Resistance);
                        model.Id = _databaseAccessService.SaveDesignerItem(item);
                        wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(LightBulbDesignerItem)));
                    }
                    foreach (var model in DiagramViewModel.Items.OfType<SwitchViewModel>())
                    {
                        bool isOn = model.Component.Resistance < 1;
                        SwitchDesignerItem item = new SwitchDesignerItem(model.Id, model.Left, model.Top, isOn);
                        model.Id = _databaseAccessService.SaveDesignerItem(item);
                        wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(SwitchDesignerItem)));
                    }
                    foreach (var model in DiagramViewModel.Items.OfType<VoltmeterViewModel>())
                    {
                        VoltmeterDesignerItem item = new VoltmeterDesignerItem(model.Id, model.Left, model.Top);
                        model.Id = _databaseAccessService.SaveDesignerItem(item);
                        wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(VoltmeterDesignerItem)));
                    }
                    foreach (var model in DiagramViewModel.Items.OfType<AmmeterViewModel>())
                    {
                        AmmeterDesignerItem item = new AmmeterDesignerItem(model.Id, model.Left, model.Top);
                        model.Id = _databaseAccessService.SaveDesignerItem(item);
                        wholeDiagramToSave.DesignerItems.Add(new DiagramItemData(item.Id, typeof(AmmeterDesignerItem)));
                    }
                    //Save all connections which should now have their Connection.DataItems filled in with correct Ids
                    foreach (var model in DiagramViewModel.Items.OfType<ConnectorViewModel>())
                    {
                        FullyCreatedConnectorInfo sinkConnector = model.SinkConnectorInfo as FullyCreatedConnectorInfo;

                        Connection connection = new Connection(
                            model.Id,
                            model.SourceConnectorInfo.DataItem.Id,
                            GetOrientationFromConnector(model.SourceConnectorInfo.Orientation),
                            GetTypeOfDiagramItem(model.SourceConnectorInfo.DataItem),
                            sinkConnector.DataItem.Id,
                            GetOrientationFromConnector(sinkConnector.Orientation),
                            GetTypeOfDiagramItem(sinkConnector.DataItem));

                        model.Id = _databaseAccessService.SaveConnection(connection);
                        wholeDiagramToSave.ConnectionIds.Add(model.Id);
                    }

                    wholeDiagramToSave.Id = _databaseAccessService.SaveDiagram(wholeDiagramToSave);
                    return wholeDiagramToSave.Id;
                });
            task.ContinueWith(ant =>
            {
                int wholeDiagramToSaveId = ant.Result;
                if (!_savedDiagrams.Contains(wholeDiagramToSaveId))
                {
                    List<int> newDiagrams = new List<int>(_savedDiagrams) {wholeDiagramToSaveId};
                    SavedDiagrams = newDiagrams;
                }
                IsBusy = false;
                MessageBox.Show("Circuit \"" + wholeDiagramToSaveId + "\" saved successfully.", "Save", MessageBoxButton.OK, MessageBoxImage.Information);
            }, TaskContinuationOptions.OnlyOnRanToCompletion);
        }