public static void SaveDelta(string path, SCDeltaManager deltaManager)
 {
     using (SQLiteDB db = new SQLiteDB(path))
     {
         foreach (DataDelta delta in deltaManager.Deltas)
         {
             if (delta.PropertyChangedArgs != null)
             {
                 //Edit
                 PropertyChangedEventArgs args = delta.PropertyChangedArgs;
                 if (delta.Sender is Commodity commodity)
                 {
                     //Commodity
                     if (args.PropertyName == "Name")
                     {
                         db.EditProperty("Name", commodity.Guid.ToString(), commodity.Name);
                     }
                 }
                 else if (delta.Sender is TradingPort port)
                 {
                     //TradingPort
                     if (args.PropertyName == "Name")
                     {
                         db.EditProperty("Name", port.Guid.ToString(), port.Name);
                     }
                 }
             }
             else if (delta.RelationshipChangedArgs != null)
             {
                 RelationshipChangedArgs          args       = delta.RelationshipChangedArgs;
                 NotifyCollectionChangedEventArgs notifyArgs = args.Args;
                 //Add/Remove
                 if (notifyArgs.Action == NotifyCollectionChangedAction.Add)
                 {
                     foreach (object item in notifyArgs.NewItems)
                     {
                         if (item is Commodity commodity)
                         {
                             addCommodity(db, commodity);
                         }
                         else if (item is TradingPort port)
                         {
                             addTradingPort(db, port);
                         }
                         else if (item is CommodityPrice price)
                         {
                             addCommodityPrice(db, price);
                             if (args.Parent is TradingPort priceParent)
                             {
                                 addTradingPortCommodityPrice(db, priceParent, price);
                             }
                             else
                             {
                                 Console.WriteLine("No parent to TradingPort");
                             }
                         }
                         else if (item is PricePoint point)
                         {
                             if (args.Parent is CommodityPrice pointParent)
                             {
                                 addPricePoint(db, point, pointParent);
                             }
                             else
                             {
                                 Console.WriteLine("No parent to PricePoint.");
                             }
                         }
                     }
                 }
                 else if (notifyArgs.Action == NotifyCollectionChangedAction.Remove)
                 {
                     foreach (object item in notifyArgs.OldItems)
                     {
                         if (item is Commodity commodity)
                         {
                             removeCommodity(db, commodity);
                         }
                         else if (item is TradingPort port)
                         {
                             removeTradingPort(db, port);
                         }
                         else if (item is CommodityPrice price)
                         {
                             removeCommodityPrice(db, price);
                             removePricePointsInCommodityPrice(db, price);
                             if (args.Parent is TradingPort priceParent)
                             {
                                 removeTradingPortCommodityPrice(db, priceParent, price);
                             }
                             else
                             {
                                 Console.WriteLine("No parent to Trading Port");
                             }
                         }
                     }
                 }
                 else
                 {
                     Console.WriteLine("Unhandled Collection Changed Action: {0}", notifyArgs.Action);
                 }
             }
             else
             {
                 Console.WriteLine("Empty delta. Sender: {0}", delta.Sender);
             }
         }
     }
 }
        public static SCDataManager Load(string path)
        {
            using (SQLiteDB db = new SQLiteDB(path))
            {
                SCDataManager dataManager = new SCDataManager();

                //Commodity
                DataTable commodityTable = db.GetDataFromTable("Commodity");
                foreach (DataRow row in commodityTable.Rows)
                {
                    Guid   guid = new Guid(row.ItemArray[0].ToString());
                    string name = row.ItemArray[1].ToString();

                    Commodity commodity = new Commodity(name, guid);
                    dataManager.Commodities.Add(commodity);
                }
                Dictionary <Guid, Commodity> commodityDict = createGuidDictionary(dataManager.Commodities);

                //TradingPort
                DataTable tradingPortTable = db.GetDataFromTable("TradingPort");
                foreach (DataRow row in tradingPortTable.Rows)
                {
                    Guid   guid = new Guid(row.ItemArray[0].ToString());
                    string name = row.ItemArray[1].ToString();

                    TradingPort port = new TradingPort(name, guid);
                    dataManager.TradingPorts.Add(port);
                }
                Dictionary <Guid, TradingPort> portDict = createGuidDictionary(dataManager.TradingPorts);

                //TradingPortComodityPrice
                DataTable portPriceTable = db.GetDataFromTable("TradingPortCommodityPrice");
                Dictionary <Guid, TradingPort> priceToPort = new Dictionary <Guid, TradingPort>();
                foreach (DataRow row in portPriceTable.Rows)
                {
                    Guid portGuid  = new Guid(row.ItemArray[0].ToString());
                    Guid priceGuid = new Guid(row.ItemArray[1].ToString());
                    priceToPort.Add(priceGuid, portDict[portGuid]);
                }

                //CommodityPrice
                DataTable             priceTable = db.GetDataFromTable("CommodityPrice");
                List <CommodityPrice> allPrices  = new List <CommodityPrice>();
                foreach (DataRow row in priceTable.Rows)
                {
                    Guid      guid          = new Guid(row.ItemArray[0].ToString());
                    Guid      commodityGuid = new Guid(row.ItemArray[1].ToString());
                    Commodity commodity     = commodityDict[commodityGuid];
                    PriceType type          = PriceTypeUtils.ConvertString(row.ItemArray[2].ToString());

                    CommodityPrice price = new CommodityPrice(commodity, type, guid);

                    TradingPort port = priceToPort[price.Guid];
                    port.Prices.Add(price);

                    allPrices.Add(price);
                }
                Dictionary <Guid, CommodityPrice> priceDict = createGuidDictionary(allPrices);

                //PricePoint
                DataTable pointTable = db.GetDataFromTable("PricePoint");
                foreach (DataRow row in pointTable.Rows)
                {
                    Guid     commodityPriceGuid = new Guid(row.ItemArray[0].ToString());
                    double   priceDouble        = (double)row.ItemArray[1];
                    DateTime dateTime           = new DateTime(Convert.ToInt64(row.ItemArray[2]));

                    CommodityPrice commodityPrice = priceDict[commodityPriceGuid];
                    commodityPrice.AddPrice(priceDouble, dateTime);
                }

                return(dataManager);
            }
        }