public async Task UpdateChildren <T, TProperty>(T parent, Expression <Func <T, IEnumerable <TProperty> > > childSelector, IEqualityComparer <TProperty> comparer = null) where T : BaseEntity where TProperty : BaseEntity { var stateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager; var currentChildren = childSelector.Invoke(parent) ?? Enumerable.Empty <TProperty>(); var existingChildren = await Set <T>().Where(x => x.Id == parent.Id).SelectMany(childSelector).AsNoTracking().ToListAsync(); if (comparer == null) { comparer = new BaseEntityComparer(); } var addedChildren = currentChildren.Except(existingChildren, comparer).AsEnumerable(); var deletedChildren = existingChildren.Except(currentChildren, comparer).AsEnumerable(); foreach (var child in currentChildren) { await AddOrUpdate(child); } foreach (var child in addedChildren) { stateManager.ChangeRelationshipState(parent, child, childSelector.Name, EntityState.Added); } foreach (var child in deletedChildren) { Entry(child).State = EntityState.Unchanged; stateManager.ChangeRelationshipState(parent, child, childSelector.Name, EntityState.Deleted); } }
public async Task UpdateForeignChildren <T, TProperty>(T parent, Expression <Func <T, IEnumerable <TProperty> > > childSelector, IEqualityComparer <TProperty> comparer = null) where T : BaseEntity where TProperty : BaseEntity { var children = (childSelector.Invoke(parent) ?? Enumerable.Empty <TProperty>()).ToList(); foreach (var child in children) { await AddOrUpdate(child); } var existingChildren = await Set <T>().Where(x => x.Id == parent.Id).SelectMany(childSelector).AsNoTracking().ToListAsync(); if (comparer == null) { comparer = new BaseEntityComparer(); } foreach (var child in existingChildren.Except(children, comparer)) { Entry(child).State = EntityState.Deleted; } }