public ServiceResult <string> Save(BlogEntryModel entryModel) { if (entryModel == null) { throw new ArgumentNullException("entryModel"); } entryModel.RebuildTagsFromString(); BlogEntry entry = null; if (!Exists(entryModel.Slug)) { entry = new BlogEntry { Slug = entryModel.Title.ToUrlSlug(), DateCreated = DateTime.Now }; if (Exists(entry.Slug)) { return(ServiceResult <string> .Error("Sorry, a post with that slug already exists.")); } } else { entry = AutoMapper.Mapper.Map <BlogEntryEntity, BlogEntry>(_blogRepository.Single <BlogEntryEntity>(b => b.Slug == entryModel.Slug)); entry.DateCreated = DateTime.ParseExact(entryModel.Date, DateSettings.DateStringFormat(), Thread.CurrentThread.CurrentCulture); var slugChanged = !string.Equals(entryModel.Slug, entryModel.NewSlug, StringComparison.InvariantCultureIgnoreCase) && !string.IsNullOrWhiteSpace(entryModel.NewSlug); if (slugChanged) { if (Exists(entryModel.NewSlug)) { return(ServiceResult <string> .Error("Sorry, a post with that slug already exists.")); } //delete current one as slug is the ID will create / save a new one. Delete(entryModel.Slug); entry.Slug = entryModel.NewSlug.ToLowerInvariant(); } } if (!IsValidSlug(entry.Slug)) { return(ServiceResult <string> .Error("That's not a valid slug. Only letters, numbers and hypens are allowed.")); } entry.Title = entryModel.Title; entry.Markdown = entryModel.Markdown; entry.Summary = CreateSummary(entryModel.Markdown); entry.IsPublished = entryModel.IsPublished; entry.IsCodePrettified = entryModel.IsCodePrettified; entry.Author = _blogUserService.FindByName(_currentUserService.GetUserName()).DisplayName; //update all the tags. var tags = _blogRepository.All <TagEntity>().ToArray(); var distinctTags = entryModel.Tags.Distinct(); var trimmedTags = distinctTags.Select(t => t.Trim().ToLowerInvariant()).ToArray(); var matchedTags = tags.Where(t => trimmedTags.Contains(t.Name.ToLowerInvariant())).ToArray(); var newTags = trimmedTags.Where(t => tags.All(tag => tag.Name.ToLowerInvariant() != t)) .Select(t => new TagEntity { Id = 0, Name = t }).ToArray(); //ensure new tags are added to the list of known tags. foreach (var newTag in newTags) { _blogRepository.Add(newTag); } var actualTags = newTags.Union(matchedTags); var entryEntity = AutoMapper.Mapper.Map <BlogEntry, BlogEntryEntity>(entry); entryEntity.Tags.Clear(); entryEntity.Tags.AddRange(actualTags); _blogRepository.Save(entryEntity, b => b.Slug == entry.Slug); _blogTagService.RemoveUnsedTags(); _blogTagService.UpdateTagCount(); return(ServiceResult <string> .Success(entry.Slug)); }