public void Synchronize()
        {
            if (_communicationService != null)
            {
                CommunicationContactPart master = _communicationService.EnsureMasterContact();
                _transactionManager.RequireNew();

                // assegna un contact a ogni device
                int idmaster            = master.Id;
                var notificationrecords = _pushNotificationRepository.Fetch(x => x.Produzione && x.Validated).ToList();
                foreach (PushNotificationRecord rec in notificationrecords)
                {
                    rec.MobileContactPartRecord_Id = EnsureContactId(rec.UUIdentifier, idmaster);
                    _pushNotificationRepository.Update(rec);
                    _transactionManager.RequireNew();
                }
                _pushNotificationRepository.Flush();
                _notifier.Add(NotifyType.Information, T("Linked {0} device To Master contact", notificationrecords.Count().ToString()));
                string message = string.Format("Linked {0} device To Master contact", notificationrecords.Count().ToString());
                Logger.Log(OrchardLogging.LogLevel.Information, null, message, null);

                _transactionManager.RequireNew();

                // elimina gli userDevice riferiti a utenti inesistenti (perché cancellati)
                UserPart user = null;
                List <UserDeviceRecord> elencoUdr = _userDeviceRecord.Fetch(x => x.UserPartRecord.Id > 0).ToList();
                foreach (UserDeviceRecord udr in elencoUdr)
                {
                    user = _orchardServices.ContentManager.Get <UserPart>(udr.UserPartRecord.Id);
                    if (user == null)
                    {
                        _userDeviceRecord.Delete(udr);
                        _transactionManager.RequireNew();
                    }
                }
                _userDeviceRecord.Flush();
                _transactionManager.RequireNew();

                // elimina gli userDevice duplicati (con lo stesso UUIdentifier) e tiene il più recente (in base all'Id del record)
                string uuidPrecedente = "";
                elencoUdr = _userDeviceRecord.Fetch(x => x.UUIdentifier != null).OrderBy(y => y.UUIdentifier).OrderByDescending(z => z.Id).ToList();
                foreach (UserDeviceRecord udr in elencoUdr)
                {
                    if (udr.UUIdentifier == uuidPrecedente)
                    {
                        _userDeviceRecord.Delete(udr);
                        _transactionManager.RequireNew();
                    }
                    else
                    {
                        uuidPrecedente = udr.UUIdentifier;
                    }
                }
                _userDeviceRecord.Flush();
                _transactionManager.RequireNew();
            }
        }