/// <summary> /// Load diagram from DB /// </summary> /// <param name="canvas">Canvas for diagram</param> /// <param name="data">XML attribute from DB</param> public async Task LoadDiagram(DesignerCanvas canvas, XDocument data) { var root = data.Root; ViewModel.LoadFromElement(data.Root); if (ViewModel.CanvasWidth != DatabaseModelDesignerViewModel.DefaultWidth || ViewModel.CanvasHeight != DatabaseModelDesignerViewModel.DefaultWidth) { StreamGeometry geometry = DesignerCanvas.CreateGridWithStreamGeometry(ViewModel.CanvasHeight, ViewModel.CanvasWidth, DesignerCanvas.GridCellWidth); canvas.RefreshGuideLines(geometry); } var labels = root?.XPathSelectElements("LabelViewModels/LabelViewModel") .Select(t => { var vm = new LabelViewModel(); vm.LoadFromElement(t); return(vm); }).ToList(); if (labels != null && labels.Any()) { foreach (LabelViewModel label in labels) { ViewModel.LabelViewModels.Add(label); } } var ctx = new DatabaseContext(SessionProvider.Instance.ConnectionType); var tablesInDb = await Task.Run(() => ctx.ListTables()); var tableElements = root?.XPathSelectElements("TableViewModels/TableViewModel") .Select(t => { var vm = new TableViewModel(); vm.LoadFromElement(t); return(vm); }) .Where(s => tablesInDb.Any(t => t.Id.Equals(s.Model.Id))) .ToList(); Output.WriteLine(DiagramLoaded); if (tableElements == null || !tableElements.Any()) { return; } var relationShipsInDb = await Task.Run(() => ctx.ListAllForeignKeys()); var allRelationshipsDetailsPom = new List <RelationshipModel>(); foreach (TableViewModel model in tableElements) { TableModel tab = ctx.ReadTableDetails(model.Model.Id, model.Model.Title); model.Model.RefreshModel(tab); ViewModel.TableViewModels.Add(model); } foreach (TableViewModel model in tableElements) { IEnumerable <RelationshipModel> models = await Task.Run(() => ctx.ListRelationshipsForTable(model.Model.Title, tableElements.Select(s => s.Model))); allRelationshipsDetailsPom.AddRange(models); } var allRelationshipsDetails = allRelationshipsDetailsPom .GroupBy(t => t.Name) .Select(t => t.FirstOrDefault()) .ToList(); var relationElements = root?.XPathSelectElements("ConnectionInfoViewModels/ConnectionInfoViewModel") .Select(t => { var vm = new ConnectionInfoViewModel { DesignerCanvas = canvas }; vm.LoadFromElement(t); return(vm); }) .Where(t => relationShipsInDb.Any(s => s.Equals(t.RelationshipModel.Name))) .Where(t => allRelationshipsDetails.Any(s => ctx.AreRelationshipModelsTheSame(t.RelationshipModel, s))) .ToList(); relationElements.ForEach(t => { t.SourceViewModel = tableElements.FirstOrDefault(s => s.Model.Id.Equals(t.RelationshipModel.Source.Id)); t.DestinationViewModel = tableElements.FirstOrDefault(s => s.Model.Id.Equals(t.RelationshipModel.Destination.Id)); t.RelationshipModel.RefreshModel(allRelationshipsDetails.FirstOrDefault(s => ctx.AreRelationshipModelsTheSame(t.RelationshipModel, s))); ViewModel.ConnectionInfoViewModels.Add(t); t.BuildLoadedConnection(); }); var newRelations = allRelationshipsDetails .Where(t => !relationElements.Any(s => s.RelationshipModel.Name.Equals(t.Name))) .Select(t => { var vm = new ConnectionInfoViewModel { DesignerCanvas = canvas, SourceViewModel = tableElements.FirstOrDefault(s => s.Model.Id.Equals(t.Source.Id)), DestinationViewModel = tableElements.FirstOrDefault(s => s.Model.Id.Equals(t.Destination.Id)) }; vm.RelationshipModel.RefreshModel(t); return(vm); }) .ToList(); newRelations.ForEach(async t => { ViewModel.ConnectionInfoViewModels.Add(t); await t.BuildConnection3(ViewModel); }); }