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)); }
private void RemoveRootBetwenSelfAndChilds <T>(IParentChildUrlChainedItem <T> root, IParentChildUrlChainedItem <T> child) where T : class { child.ParentId = root.ParentId; unitOfWork.Update(child); }
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>); }