/// <summary> /// 删除评论 /// </summary> /// <param name="id">评论Id</param> public int Delete(long id) { Comment comment = Get(id); var sql = PetaPoco.Sql.Builder; sql.Append("DELETE FROM tn_Comments ").Where("Id=@0 or ParentId=@0", id); int affectCount = CreateDAO().Execute(sql); #region 处理缓存 if (affectCount > 0) { //列表缓存 RealTimeCacheHelper.MarkDeletion(comment); } #endregion return(affectCount); }
/// <summary> /// 从fromCategoryId并入到toCategoryId /// </summary> /// <remarks> /// 例如:将分类fromCategoryId合并到分类toCategoryId,那么fromCategoryId分类下的所有子分类和实体全部归到toCategoryId分类,同时删除fromCategoryId分类 /// </remarks> /// <param name="fromCategoryId">源类别</param> /// <param name="toCategoryId">目标类别</param> public void Merge(long fromCategoryId, long toCategoryId) { //为处理缓存做准备 T fromCategory = Get(fromCategoryId); #region 组装sql //1 将所有的子分类合并到toCategoryId下 var sql_ChildCategoryUpdate = PetaPoco.Sql.Builder; sql_ChildCategoryUpdate.Append("update tn_Categories set ParentId = @0", toCategoryId).Where("ParentId = @0", fromCategoryId); //2 将fromCategoryId下的所有直属实体类合并到toCategoryId下 var sql_ChildItemsUpdate = PetaPoco.Sql.Builder; sql_ChildItemsUpdate.Append("update tn_ItemsInCategories set CategoryId = @0", toCategoryId).Where("CategoryId = @0", fromCategoryId); //3 更新后代分类深度 //获得所有fromCategory的后代Category T toCategory = Get(toCategoryId); IList <T> fromChildCategories = new List <T>(); IEnumerable <T> ownerCategories = GetOwnerCategories(toCategory.OwnerId, toCategory.TenantTypeId); this.RecurseGetChildren(fromCategory, fromChildCategories, ownerCategories.ToList()); //循环更新fromCategory每一个后代Category的Depth IList <Sql> sql_UpdateFromChildCategoryDepths = new List <Sql>(); foreach (T fromChildCategory in fromChildCategories) { int fromChildCategoryDepth = toCategory.Depth + fromChildCategory.Depth - fromCategory.Depth; fromChildCategory.Depth = fromChildCategoryDepth; sql_UpdateFromChildCategoryDepths.Add(Sql.Builder.Append("update tn_Categories set Depth = @0", fromChildCategoryDepth).Where("CategoryId=@0", fromChildCategory.CategoryId)); } //4 修改toCategory 的属性:ChildCount,ItemCount //见下:sql_ToCategoryChildCountUpdate //5 最后删除fromCategory var sql_FromCategoryDelete = PetaPoco.Sql.Builder; sql_FromCategoryDelete.Append("delete tn_Categories").Where("CategoryId = @0", fromCategoryId); //6 修改原先from的父级分类的子分类数减一 var sql_FromParentCategoryChildCountUpdate = PetaPoco.Sql.Builder; if (fromCategory.ParentId > 0) { sql_FromParentCategoryChildCountUpdate.Append("update tn_Categories set ChildCount = ChildCount-1 ").Where("ChildCount > 0 and CategoryId = @0", fromCategory.ParentId); } #endregion int childCategoryCount = 0 /*子分类数*/, childItemCount = 0 /*内容数*/, updateToCategoryCount = 0, deleteEffectLineCount = 0, affectCount = 0, updateDepthCount = 0; PetaPocoDatabase dao = CreateDAO(); //在同一个事务中执行 using (var scope = dao.GetTransaction()) { //1 childCategoryCount = dao.Execute(sql_ChildCategoryUpdate); //2 childItemCount = dao.Execute(sql_ChildItemsUpdate); //3 var sql_ToCategoryChildCountUpdate = PetaPoco.Sql.Builder; sql_ToCategoryChildCountUpdate.Append("update tn_Categories set ChildCount =ChildCount + @0,ItemCount=ItemCount + @1", childCategoryCount, childItemCount).Where("CategoryId = @0", toCategoryId); updateToCategoryCount = dao.Execute(sql_ToCategoryChildCountUpdate); //4 updateDepthCount = dao.Execute(sql_UpdateFromChildCategoryDepths); //5 deleteEffectLineCount = dao.Execute(sql_FromCategoryDelete); //6 if (fromCategory.ParentId > 0) { affectCount = dao.Execute(sql_FromParentCategoryChildCountUpdate); } //事务结束 scope.Complete(); } #region 缓存处理 //标记删除 if (deleteEffectLineCount > 0) { RealTimeCacheHelper.MarkDeletion(fromCategory); } if (updateToCategoryCount > 0) { //实体缓存,toCategory RealTimeCacheHelper.IncreaseEntityCacheVersion(toCategoryId); //处理所有的列表缓存toCategory 相关的列表 RealTimeCacheHelper.IncreaseAreaVersion("OwnerId", toCategory.OwnerId); RealTimeCacheHelper.IncreaseAreaVersion("ParentId", toCategory.CategoryId); //处理全局缓存(后台管理) RealTimeCacheHelper.IncreaseGlobalVersion(); } if (updateDepthCount > 0 && ownerCategories.Count() > 1) { foreach (var ownerCategory in ownerCategories) { if (ownerCategory.ParentId == fromCategoryId) { ownerCategory.ParentId = toCategoryId; } RealTimeCacheHelper.IncreaseEntityCacheVersion(ownerCategory.CategoryId); } } //处理分类下的内容项的缓存 if (childItemCount > 0) { //toCategory以及父级 List <long> toCategoryParentsIds = new List <long>(); RecurseGetParents(toCategoryId, toCategoryParentsIds); toCategoryParentsIds.Add(toCategoryId); foreach (long categoryId in toCategoryParentsIds) { EntityData.ForType(typeof(ItemInCategory)).RealTimeCacheHelper.IncreaseAreaVersion("CategoryId", toCategoryId); } //fromCategory父级 List <long> fromCategoryParentsIds = new List <long>(); RecurseGetParents(fromCategoryId, fromCategoryParentsIds); foreach (long categoryId in fromCategoryParentsIds) { EntityData.ForType(typeof(ItemInCategory)).RealTimeCacheHelper.IncreaseAreaVersion("CategoryId", toCategoryId); } } #endregion }