public async Task Update(ContactAllData contactAllData)
        {
            var currentContactDbModel = await _contactData.GetOne(
                contactAllData.Id,
                includes => includes.Add(c => c.Tags).Add(c => c.Emails).Add(c => c.PhoneNumbers)
                );

            if (currentContactDbModel == null)
            {
                throw new ModelNotFoundException();
            }

            _unitOfWork.DeleteRange(currentContactDbModel.Tags);
            _unitOfWork.DeleteRange(currentContactDbModel.Emails);
            _unitOfWork.DeleteRange(currentContactDbModel.PhoneNumbers);
            await _unitOfWork.PersistChanges();


            EnsureConsistency(contactAllData);
            var updatedContactDbModel = _mapper.Map <Contact>(contactAllData);

            await IdentifyTags(updatedContactDbModel);

            var unPersistedTags = updatedContactDbModel.Tags.Select(e => e.Tag).Where(e => e.Id == 0);

            _unitOfWork.Update(updatedContactDbModel);
            _unitOfWork.SaveRange(updatedContactDbModel.Emails);
            _unitOfWork.SaveRange(updatedContactDbModel.PhoneNumbers);
            _unitOfWork.SaveRange(unPersistedTags);
            _unitOfWork.SaveRange(updatedContactDbModel.Tags);

            await _unitOfWork.PersistChanges();
        }
 private void EnsureConsistency(ContactAllData contact)
 {
     contact.Tags = contact.Tags != null?contact.Tags.Distinct() : new string[]
     {
     };
     contact.Emails = contact.Emails != null?contact.Emails.Distinct() : new string[]
     {
     };
     contact.PhoneNumbers = contact.PhoneNumbers != null?contact.PhoneNumbers.Distinct() : new long[]
     {
     };
 }
        public async Task Save(ContactAllData contact)
        {
            EnsureConsistency(contact);
            var contactDbModel = _mapper.Map <Contact>(contact);

            await IdentifyTags(contactDbModel);

            var unPersistedTags = contactDbModel.Tags.Select(e => e.Tag).Where(e => e.Id == 0);

            _unitOfWork.SaveRange(unPersistedTags);
            //await _unitOfWork.PersistChanges();

            _unitOfWork.Save(contactDbModel);
            await _unitOfWork.PersistChanges();

            contact.Id = contactDbModel.Id;
        }
 public Task Put(ContactAllData c) =>
 _safeRunner.Run(() => _contactsService.Update(c), Ok);
 public Task Post(ContactAllData c) =>
 _safeRunner.Run(() => _contactsService.Save(c), Ok);