/// <summary>
        /// This addAddress method takes in an AddressRequest which contains the details for the address to be added
        /// This is utilizing a Request/Response pattern
        /// </summary>
        /// <param name="request">an instance of AddressRequest that contains address details</param>
        /// <returns>AddressResponse which contains any errors/validation messages or Id of address added</returns>
        public AddressResponse addAddress(AddressRequest request)
        {
            AddressResponse response = new AddressResponse();

            // first check to see if have valid state abbreviation
            if (validateState(request.StateAbbreviation))
            {
                try
                {
                    using (var db = new AddressContext())
                    {
                        AppCore_Address address = new AppCore_Address();
                        address.AddressLine1 = request.AddressLine1;
                        address.AddressLine2 = request.AddressLine2;
                        address.City         = request.City;
                        address.Company      = request.Company;
                        address.Zip          = request.ZipCode;
                        address.Name         = request.Name;
                        //var query = from st in States
                        //            where st.Abbreviation == "WA"
                        //            select st;
                        //var state = query.FirstOrDefault<AppCore_State>();
                        //var state = States.Find(p => p.Abbreviation == "WA");
                        address.AppCore_State = db.AppCore_State.Where(st => st.Abbreviation == request.StateAbbreviation).First();
                        db.AppCore_Address.Add(address);
                        db.SaveChanges();
                        response.id     = address.Id;
                        response.Status = "Success";
                    }
                }
                catch (DbEntityValidationException e)
                {
                    foreach (var eve in e.EntityValidationErrors)
                    {
                        string exceptionString = "Entity of Type " + eve.Entry.Entity.GetType().Name + " in state " + eve.Entry.State + " has the following validation errors:";
                        foreach (var ve in eve.ValidationErrors)
                        {
                            exceptionString = exceptionString + "\n";
                            exceptionString = exceptionString + " - Property: " + ve.PropertyName + " Error: " + ve.ErrorMessage;
                        }
                        response.exceptions.Add(exceptionString);
                        response.Status = "Validation Errors";
                        return(response);
                    }
                    //throw;
                }
                catch (Exception e)
                {
                    response.exceptions.Add("Exception occurred: " + e.Message);
                    response.Status = "Failure";
                    return(response);
                }
            }
            else
            {
                response.exceptions.Add("Invalid state passed in: " + request.StateAbbreviation);
                response.Status = "Validation Errors";
            }
            return(response);
        }
 /// <summary>
 /// This addAdress override is used if you have an instance of an address already.
 /// </summary>
 /// <param name="address">a fully populated addres entity including state relationship</param>
 public void addAddres(AppCore_Address address)
 {
     using (var db = new AddressContext())
     {
         db.AppCore_Address.Add(address);
         db.SaveChanges();
     }
 }
        /// <summary>
        /// This is the default method to add an address.  It takes all the parameters as strings
        /// and uses them to create an instance of an address to persist to the database
        /// </summary>
        /// <param name="addressLine1">Line 1 of an address</param>
        /// <param name="addressLine2">Line 2 of an address</param>
        /// <param name="city">Associated City</param>
        /// <param name="company">Company of the address</param>
        /// <param name="zipCode">Zip Code for the addres</param>
        /// <param name="name">Name of the Address</param>
        /// <param name="stateAbbreviation">State Abreviation - this is used as the lookup into the States Table</param>
        /// <returns>AddressResponse which contains any errors/validation messages or Id of address added</returns>
        public AddressResponse addAddress(
            string addressLine1, string addressLine2, string city,
            string company, string zipCode, string name, string stateAbbreviation
            )
        {
            AddressResponse response = new AddressResponse();

            try
            {
                using (var db = new AddressContext())
                {
                    AppCore_Address address = new AppCore_Address();
                    address.AddressLine1 = addressLine1;
                    address.AddressLine2 = addressLine2;
                    address.City         = city;
                    address.Company      = company;
                    address.Zip          = zipCode;
                    address.Name         = name;
                    //var query = from st in States
                    //            where st.Abbreviation == "WA"
                    //            select st;
                    //var state = query.FirstOrDefault<AppCore_State>();
                    //var state = States.Find(p => p.Abbreviation == "WA");
                    address.AppCore_State = db.AppCore_State.Where(st => st.Abbreviation == stateAbbreviation).First();
                    db.AppCore_Address.Add(address);
                    db.SaveChanges();
                    response.Status = "Success";
                    response.id     = address.Id;
                }
            }
            catch (DbEntityValidationException e)
            {
                foreach (var entityValidationErrors in e.EntityValidationErrors)
                {
                    string exceptionString = "Entity of Type " + entityValidationErrors.Entry.Entity.GetType().Name + " in state " + entityValidationErrors.Entry.State + " has the following validation errors:";
                    foreach (var validationErrors in entityValidationErrors.ValidationErrors)
                    {
                        exceptionString = exceptionString + "\n";
                        exceptionString = exceptionString + " - Property: " + validationErrors.PropertyName + " Error: " + validationErrors.ErrorMessage;
                    }
                    response.exceptions.Add(exceptionString);
                    response.Status = "Validation Errors";
                    return(response);
                }
            }
            catch (Exception e)
            {
                response.exceptions.Add("Exception occurred: " + e.Message);
                response.Status = "Failure";
                return(response);
            }
            return(response);
        }