public void UpdateProduct(Product product) { if (product.Id == null) { throw new InvalidOperationException("cannot update a new product"); } var productId = product.Id.GetValueOrDefault(); product.CreateCheckPoint(); var keyToRemove = product.CheckPointHistory.Last().Key; // cloning the object to separate it from the original - thereby simulating a real-life data insertion var clone = (Product)product.CurrentCheckPoint; if (!ProductData.ContainsKey(productId)) { throw new InvalidOperationException("product not found"); } ProductData[productId] = clone; //get rid of checkpoint product.CheckPointHistory.Remove(keyToRemove); }