private static async Task AssignTag(WorkspaceModel workspace, string tagName, TimeEntryModel timeEntry)
        {
            var store    = ServiceContainer.Resolve <IDataStore>();
            var existing = await store.Table <TagData>()
                           .QueryAsync(r => r.WorkspaceId == workspace.Id && r.Name == tagName)
                           .ConfigureAwait(false);

            var      checkRelation = true;
            TagModel tag;

            if (existing.Count > 0)
            {
                tag = new TagModel(existing [0]);
            }
            else
            {
                tag = new TagModel()
                {
                    Name      = tagName,
                    Workspace = workspace,
                };
                await tag.SaveAsync().ConfigureAwait(false);

                checkRelation = false;
            }

            if (timeEntry != null)
            {
                var assignTag = true;

                if (checkRelation)
                {
                    // Check if the relation already exists before adding it
                    var relations = await store.Table <TimeEntryTagData> ()
                                    .CountAsync(r => r.TimeEntryId == timeEntry.Id && r.TagId == tag.Id && r.DeletedAt == null)
                                    .ConfigureAwait(false);

                    if (relations < 1)
                    {
                        assignTag = false;
                    }
                }

                if (assignTag)
                {
                    var relationModel = new TimeEntryTagModel()
                    {
                        TimeEntry = timeEntry,
                        Tag       = tag,
                    };
                    await relationModel.SaveAsync().ConfigureAwait(false);

                    timeEntry.Touch();
                    await timeEntry.SaveAsync().ConfigureAwait(false);
                }
            }
        }
        private async static void ReplaceTags(TimeEntryModel model, List <TimeEntryTagData> modelTags, List <TagData> selectedTags)
        {
            // Delete unused tag relations:
            var deleteTasks = modelTags
                              .Where(oldTag => !selectedTags.Any(newTag => newTag.Id == oldTag.TagId))
                              .Select(data => new TimeEntryTagModel(data).DeleteAsync());

            // Create new tag relations:
            var createTasks = selectedTags
                              .Where(newTag => !modelTags.Any(oldTag => oldTag.TagId == newTag.Id))
                              .Select(data => new TimeEntryTagModel()
            {
                TimeEntry = model, Tag = new TagModel(data)
            }.SaveAsync());

            await Task.WhenAll(deleteTasks.Concat(createTasks));

            if (deleteTasks.Any <Task> () || createTasks.Any <Task> ())
            {
                model.Touch();
                await model.SaveAsync();
            }
        }