示例#1
0
        private async Task FixUrlByRemovingRootBetwenSelfAndChilds <T>(IParentChildUrlChainedItem <T> root, IParentChildUrlChainedItem <T> child) where T : class
        {
            var parent = child.ParentId == root.ParentId?root.Parent as IParentChildUrlChainedItem <T> :
                         LoadParent(child);

            child.Url = parent == null ? child.UrlSegment : $"{parent.Url}/{child.UrlSegment}";
            unitOfWork.Update(child);
            unitOfWork.Entry(child).Collection(x => x.Childs).Load();
            await unitOfWork.SaveChangesAsync();

            foreach (var ch in child.Childs.ToList())
            {
                await  FixUrlByRemovingRootBetwenSelfAndChilds(root, ch as IParentChildUrlChainedItem <T>);
            }
        }
        private async Task FixUrlByParent <T>(IParentChildUrlChainedItem <T> item, IDataService <T, Guid> dataService) where T : class
        {
            item.UrlSegment = _urlBuilder.GenrateUrlSegment(string.IsNullOrEmpty(item.UrlSegment) ? item.Title : item.UrlSegment);
            if (item.ParentId.HasValue)
            {
                var parent = await((IQueryable <IParentChildUrlChainedItem <T> >)(dataService.Query)).FirstOrDefaultAsync(x => x.Id == item.ParentId.Value) as IParentChildUrlChainedItem <T>;
                item.Url = $"{parent.Url}/{item.UrlSegment}";
            }
            else
            {
                item.Url = item.UrlSegment;
            }
            var unitOfWork = Container.GetInstance <IUnitOfWork>();

            unitOfWork.Update(item);
        }
        public async Task CheckParentChildConflict <T>(IParentChildUrlChainedItem <T> item, IDataService <T, Guid> dataService) where T : class
        {
            if (item.ParentId == null)
            {
                return;
            }
            var conflictIds = new List <Guid>();

            conflictIds.Add(item.Id);
            item.Childs?.ToList().ForEach(x => AddSelfIdWithChildsIds(x as IParentChildUrlChainedItem <T>, conflictIds));

            if (conflictIds.Contains(item.ParentId.Value))
            {
                throw new InvalidOperationException($"this item has one of its child or the self id as parent id => {item}");
            }
        }
        public async Task FixItemAndChildUrls <T>(IParentChildUrlChainedItem <T> item, IDataService <T, Guid> dataService) where T : class
        {
            if (item == null)
            {
                return;
            }
            var unitOfWork = Container.GetInstance <IUnitOfWork>();

            await FixUrlByParent(item, dataService);

            unitOfWork
            .Entry(item)
            .Collection(x => x.Childs)
            .Load();
            foreach (var ch in item.Childs.ToList())
            {
                await FixItemAndChildUrls(ch as IParentChildUrlChainedItem <T>, dataService);
            }
        }
 private void AddSelfIdWithChildsIds <T>(IParentChildUrlChainedItem <T> item, List <Guid> ids) where T : class
 {
     ids.Add(item.Id);
     item.Childs?.ToList().ForEach(x => AddSelfIdWithChildsIds(x as IParentChildUrlChainedItem <T>, ids));
 }
示例#6
0
 private void RemoveRootBetwenSelfAndChilds <T>(IParentChildUrlChainedItem <T> root, IParentChildUrlChainedItem <T> child) where T : class
 {
     child.ParentId = root.ParentId;
     unitOfWork.Update(child);
 }
示例#7
0
 private IParentChildUrlChainedItem <T> LoadParent <T>(IParentChildUrlChainedItem <T> child) where T : class
 {
     unitOfWork.Entry(child).Reference(x => x.Parent).Load();
     return(child.Parent as IParentChildUrlChainedItem <T>);
 }