public static bool SavePerson(string userId, PersonDto personDto)
        {
            using (var dbContext = ApplicationDbContext.Create())
            {

                try
                {

                    if (personDto != null)
                    {

                        var person = dbContext.Persons.Where(x => x.Id == personDto.Id).FirstOrDefault();

                        var updatePersonEntity = new UpdatePersonEntity(dbContext, personDto, person, userId);

                        person = updatePersonEntity.PerformAction();
                        var updatePersonAttributes = new UpdatePersonAttributes(dbContext, personDto.PersonsAttribute.ToList(), person, userId);
                        updatePersonAttributes.PerformAction();

                        //person.PersonsAttribute.Add(new PersonsAttribute());
                        dbContext.SaveChanges();
                    }

                }
                catch (DbEntityValidationException e)
                {

                }

            }
            return true;
        }
        public static PersonDto GetPerson(string personId)
        {
            using (var dbContext = new ApplicationDbContext())
            {

                var person = dbContext.Persons
                    .Include(p => p.PersonsAttribute)
                    .Include(p => p.PersonsAttribute.Select(c => c.PersonalSubAttribute))
                    .Include(p => p.PersonsAttribute.Select(c => c.PhoneNumberSubAttribute))
                    .FirstOrDefault(x => x.Id == personId);

                var personDto = new PersonDto(person);
                return personDto;
            }
        }
        public PersonViewModel(PersonDto person)
        {
            PersonId = person.Id;
            FirstName = person.FirstName;
            LastName = person.LastName;
            Alias = person.Alias;
            Gender = person.Gender;
            DateOfBirth = person.DateOfBirth;

            ModifyActionRequired = ModifyActionRequired.Update;

            EmergencyContactViewModels = new EmergencyContactViewModels(person.PersonsAttribute);


            //EmergencyContactViewModels.Add(new EmergencyContactViewModel(1,"sdf-Sd-rt-g1-d2", "Michael","Strange","Snig", "0423170746"));
        }
 public UpdatePersonEntity(ApplicationDbContext dbContext, PersonDto personDto, Person personEntity, string applicationUserId)
 {
     _personDto = personDto;
     _personEntity = personEntity;
     _applicationUserId = applicationUserId;
     _dbContext = dbContext;
 }
        public PersonDto ToDto()
        {
            var personDto = new PersonDto();

            personDto.Id = PersonId;
            personDto.FirstName = FirstName;
            personDto.LastName = LastName;
            personDto.Alias = Alias;
            personDto.DateOfBirth = DateOfBirth;
            personDto.Gender = Gender.Value;

            personDto.ModifyActionRequired = ModifyActionRequired;


            personDto.PersonsAttribute = new List<PersonsAttributeDto>();

            if (EmergencyContactViewModels != null)
            {
                foreach (var evm in EmergencyContactViewModels)
                {

                    var personsAttributeDto = new PersonsAttributeDto();

                    personsAttributeDto.Id = evm.PersonsAttributeId;
                    personsAttributeDto.PersonId = personDto.Id;
                    personsAttributeDto.PersonsAttributeCategoryId = evm.PersonsAttributeCategoryId;
                    personsAttributeDto.ModifyActionRequired = evm.ModifyActionRequired; 

                    PersonalSubAttributeDto personalSubAttributeDto = new PersonalSubAttributeDto();
                    personalSubAttributeDto.Id = evm.PersonalSubAttributeId;
                    personalSubAttributeDto.FirstName = evm.FirstName;
                    personalSubAttributeDto.LastName = evm.LastName;
                    personalSubAttributeDto.Alias = evm.Alias;
                    personalSubAttributeDto.FirstName = evm.FirstName;

                    personalSubAttributeDto.ModifyActionRequired = evm.ModifyActionRequired;

                    personsAttributeDto.PersonalSubAttributeDtos.Add(personalSubAttributeDto);

                    var phoneNumberSubAttributeDto = new PhoneNumberSubAttributeDto();
                    phoneNumberSubAttributeDto.Id = evm.PhoneNumberSubAttributeId;
                    phoneNumberSubAttributeDto.Number = evm.PhoneNumber;
                    phoneNumberSubAttributeDto.ModifyActionRequired = evm.ModifyActionRequired;

                    personsAttributeDto.PhoneNumberSubAttributeDtos.Add(phoneNumberSubAttributeDto);

                    personDto.PersonsAttribute.Add(personsAttributeDto);

                }
            }

            return personDto;

        }
        private static void UpdatePersonAttributuesWithinEntity(ApplicationDbContext dbContext, PersonDto sourceDto, Person targetEntity)
        {
            var dbPersonAttributes = targetEntity.PersonsAttribute.ToList();
            var viewPersonAttributes = sourceDto.PersonsAttribute.ToList();

            // Remove update Old Attributes

            foreach (var dbAttr in dbPersonAttributes)
            {
                if (!viewPersonAttributes.Any(x => x.Id == dbAttr.Id))
                {
                    dbContext.Entry(dbAttr).State = EntityState.Deleted;

                }
                else
                {
                    dbContext.Entry(dbAttr).State = EntityState.Modified;
                }
            }

            // foreach(var newAttribute)
        }
 private static void TransferPersonInfoFromDtoToEntity(PersonDto sourceDto, Person targetEntity, bool generateNewPersonId = false)
 {
     targetEntity.Id = generateNewPersonId ? Guid.NewGuid().ToString() : sourceDto.Id;
     targetEntity.ApplicationUserId = sourceDto.ApplicationUserId;
     targetEntity.FirstName = sourceDto.FirstName;
     targetEntity.LastName = sourceDto.LastName;
     targetEntity.Alias = sourceDto.Alias;
     targetEntity.DateOfBirth = sourceDto.DateOfBirth;
     targetEntity.Gender = sourceDto.Gender;
 }