public void Post(PatchEvent request)
        {
            try
            {
                var source = new VEVENT
                {
                    Start = request.Start,
                    Classification = request.Classification,
                    Description = request.Description,
                    GeoPosition = request.Position,
                    Location = request.Location,
                    Organizer = request.Organizer,
                    Priority = request.Priority,
                    Sequence = request.Sequence,
                    Status = request.Status,
                    Summary = request.Summary,
                    Transparency = request.Transparency,
                    Url = request.Url,
                    RecurrenceRule = request.RecurrenceRule,
                    End = request.End,
                    Duration = request.Duration,
                    Attachments = request.Attachments,
                    Attendees = request.Attendees,
                    Categories = request.Categories,
                    Comments = request.Comments,
                    Contacts = request.Contacts,
                    ExceptionDates = request.ExceptionDates,
                    RequestStatuses = request.RequestStatuses,
                    Resources = request.Resources,
                    RelatedTos = request.RelatedTos,
                    Alarms = request.Alarms,
                };

                var fields = new List<string>();
                if (source.Start != default(DATE_TIME)) fields.Add("Start");
                if (source.Classification != default(CLASS)) fields.Add("Classification");
                if (source.Description != null) fields.Add("Description");
                if (source.GeoPosition != default(GEO)) fields.Add("Position");
                if (source.Location != null) fields.Add("Location");
                if (source.Organizer != null) fields.Add("Organizer");
                if (source.Priority != default(PRIORITY)) fields.Add("Priority");
                if (source.Sequence != default(int)) fields.Add("Sequence");
                if (source.Status != default(STATUS)) fields.Add("Status");
                if (source.Summary != null) fields.Add("Summary");
                if (source.Transparency != default(TRANSP)) fields.Add("Transparency");
                if (source.Url != default(URL)) fields.Add("Url");
                if (source.RecurrenceRule != null) fields.Add("RecurrenceRule");
                if (source.End != default(DATE_TIME)) fields.Add("End");
                if (source.Duration != default(DURATION)) fields.Add("Duration");
                if (source.Categories != null) fields.Add("Categories");
                if (source.Attachments != null) fields.Add("Attachments");
                if (source.Attendees != null) fields.Add("Attendees");
                if (source.Comments != null) fields.Add("Comments");
                if (source.Contacts != null) fields.Add("Contacts");
                if (source.ExceptionDates != null) fields.Add("ExceptionDates");
                if (source.RequestStatuses != null) fields.Add("RequestStatuses");
                if (source.Resources != null) fields.Add("Resources");
                if (source.RelatedTos != null) fields.Add("RelatedTos");
                if (source.Alarms != null) fields.Add("Alarms");

                eventRepository.Patch(source, fields, request.EventId.ToSingleton());

                var cacheKey = keyBuilder.Build(request, x => x.EventId).ToString();
                RequestContext.RemoveFromCache(Cache, cacheKey);
            }
            catch (InvalidOperationException ex)
            {
                logger.Error(ex.ToString());
                throw;
            }
            catch (ApplicationException ex)
            {
                logger.Error(ex.ToString());
                throw;
            }
            catch (Exception ex)
            {
                logger.Error(ex.ToString()); 
                throw;
            }
        }