private void ApplyChanges(IEnumerable <TreeNode> children) { foreach (TreeNode child in children) { switch (child.State) { case NodeState.Added: _treeRepository.Add(TreeNode.Clone(child)); break; case NodeState.Modified: _treeRepository.Update(TreeNode.Clone(child)); break; case NodeState.Deleted: _treeRepository.Delete(TreeNode.Clone(child)); break; case NodeState.Unchanged: break; default: throw new ArgumentOutOfRangeException(); } ApplyChanges(_treeContext.Tree.Values.Where(n => n.ParentId == child.Id)); } }