Exemple #1
0
    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);
        }
    }
Exemple #2
0
    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;
        }
    }