// Do NOT do this in practices, have a separate create for phone numbers.
        // The only reason I did this is we scaffolded the phone number table and I didn't want to cause conflicts.
        public int CreatePerson(string firstName, string lastName, string phone)
        {
            firstName = firstName != null?firstName.Trim() : null;

            lastName = lastName != null?lastName.Trim() : null;

            phone = phone != null?phone.Trim() : null;

            int createdID;

            PersonValidationException exception = new PersonValidationException();

            // Be a little more specific than "== null" because that doesn't account for whitespace.
            if (string.IsNullOrWhiteSpace(firstName))
            {
                exception.SubExceptions.Add(new ArgumentNullException(nameof(firstName), "First name was not provided."));
            }
            else
            {
                if (firstName.Any(x => char.IsDigit(x)))
                {
                    exception.SubExceptions.Add(new ArgumentException(nameof(firstName), "First name cannot contain numbers."));
                }
                if (firstName.Length > 50)
                {
                    exception.SubExceptions.Add(new ArgumentOutOfRangeException(nameof(firstName), "First name cannot be more than 50 characters long."));
                }
            }

            if (string.IsNullOrWhiteSpace(lastName))
            {
                exception.SubExceptions.Add(new ArgumentNullException(nameof(lastName), "Last name was not provided."));
            }
            else
            {
                if (lastName.Any(x => char.IsDigit(x)))
                {
                    exception.SubExceptions.Add(new ArgumentException(nameof(lastName), "Last name cannot contain numbers."));
                }
                if (lastName.Length > 50)
                {
                    exception.SubExceptions.Add(new ArgumentOutOfRangeException(nameof(lastName), "Last name cannot be more than 50 characters long."));
                }
            }

            if (string.IsNullOrWhiteSpace(phone))
            {
                exception.SubExceptions.Add(new ArgumentNullException(nameof(phone), "Phone number was not provided."));
            }
            else
            {
                // Check for phone number formatting (feel free to use RegEx or any other method).
                // Has to be in the else branch to avoid null reference exceptions.
                int      temp;
                string[] phoneParts = phone.Split('-');
                if (!(
                        phoneParts[0].Length == 3 &&
                        int.TryParse(phoneParts[0], out temp) &&
                        phoneParts[1].Length == 3 &&
                        int.TryParse(phoneParts[1], out temp) &&
                        phoneParts[2].Length == 4 &&
                        int.TryParse(phoneParts[2], out temp)
                        ))
                {
                    exception.SubExceptions.Add(new ArgumentException(nameof(phone), "Phone number was not in a valid format."));
                }
            }

            // If any exceptions have been generated by any validation, throw them as one bundled exception.
            if (exception.SubExceptions.Count > 0)
            {
                throw exception;
            }

            // If we're at this point, we have no exceptions, as nothing got thrown.
            // At this point, ID is 0.
            Person newPerson = new Person()
            {
                FirstName = firstName,
                LastName  = lastName
            };
            PhoneNumber newPhoneNumber = new PhoneNumber()
            {
                Number = phone,
                Person = newPerson
            };

            // Add the new model instances to the database.
            using (PersonContext context = new PersonContext())
            {
                // By adding our object to the context, we're queueing it to receive an AUTO_INCREMENT ID once saved.
                context.People.Add(newPerson);
                context.PhoneNumbers.Add(newPhoneNumber);
                // When we save it, the object and all references thereto are updated with the new ID.
                context.SaveChanges();
                // Which makes it very simple to then get the new ID to return.
                createdID = newPerson.ID;
            }
            return(createdID);
        }
        // A PUT request, semantically, overwrites an entire entity and does not update a specific field.
        public void UpdatePerson(string id, string firstName, string lastName)
        {
            id = id != null?id.Trim() : null;

            firstName = firstName != null?firstName.Trim() : null;

            lastName = lastName != null?lastName.Trim() : null;

            int idParsed = 0;

            using (PersonContext context = new PersonContext())
            {
                PersonValidationException exception = new PersonValidationException();

                if (string.IsNullOrWhiteSpace(id))
                {
                    exception.SubExceptions.Add(new ArgumentNullException(nameof(id), "ID was not provided."));
                }
                else
                {
                    if (!int.TryParse(id, out idParsed))
                    {
                        exception.SubExceptions.Add(new ArgumentException(nameof(id), "ID was not valid."));
                    }
                    else
                    {
                        if (context.People.Where(x => x.ID == idParsed).Count() != 1)
                        {
                            exception.SubExceptions.Add(new NullReferenceException("Person with that ID does not exist."));
                        }
                    }
                }
                if (string.IsNullOrWhiteSpace(firstName))
                {
                    exception.SubExceptions.Add(new ArgumentNullException(nameof(firstName), "First name was not provided."));
                }
                else
                {
                    if (firstName.Any(x => char.IsDigit(x)))
                    {
                        exception.SubExceptions.Add(new ArgumentException(nameof(firstName), "First name cannot contain numbers."));
                    }
                    if (firstName.Length > 50)
                    {
                        exception.SubExceptions.Add(new ArgumentOutOfRangeException(nameof(firstName), "First name cannot be more than 50 characters long."));
                    }
                }

                if (string.IsNullOrWhiteSpace(lastName))
                {
                    exception.SubExceptions.Add(new ArgumentNullException(nameof(lastName), "Last name was not provided."));
                }
                else
                {
                    if (lastName.Any(x => char.IsDigit(x)))
                    {
                        exception.SubExceptions.Add(new ArgumentException(nameof(lastName), "Last name cannot contain numbers."));
                    }
                    if (lastName.Length > 50)
                    {
                        exception.SubExceptions.Add(new ArgumentOutOfRangeException(nameof(lastName), "Last name cannot be more than 50 characters long."));
                    }
                }

                // If any exceptions have been generated by any validation, throw them as one bundled exception.
                if (exception.SubExceptions.Count > 0)
                {
                    throw exception;
                }

                // If we're at this point, we have no exceptions, as nothing got thrown.
                Person target = context.People.Where(x => x.ID == idParsed).Single();
                target.FirstName = firstName;
                target.LastName  = lastName;
                context.SaveChanges();
            }
        }