public DynamicProperty[] SaveProperties(DynamicProperty[] properties) { if (properties == null) throw new ArgumentNullException("properties"); using (var repository = _repositoryFactory()) using (var changeTracker = GetChangeTracker(repository)) { var sourceProperties = properties.Select(x => x.ToEntity()).ToList(); var targetProperties = repository.GetDynamicPropertiesByIds(properties.Select(x => x.Id).ToArray()).ToList(); sourceProperties.CompareTo(targetProperties, EqualityComparer<DynamicPropertyEntity>.Default, (state, source, target) => { if (state == EntryState.Modified) { changeTracker.Attach(target); source.Patch(target); } else if (state == EntryState.Added) { repository.Add(source); } }); repository.UnitOfWork.Commit(); var result = repository.GetDynamicPropertiesByIds(sourceProperties.Select(p => p.Id).ToArray()) .Select(p => p.ToModel()) .ToArray(); return result; } }