c# – 使用nhibernate时,最优雅的方式来更新子集合(不创建不必要的添加和删除)?

前端之家收集整理的这篇文章主要介绍了c# – 使用nhibernate时,最优雅的方式来更新子集合(不创建不必要的添加和删除)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个名为Project的域对象映射到sql Server数据库中的表.它有一个名为Dependencies的列表属性.
  1. public class Project
  2. {
  3. public int Id;
  4. public List<ProjectDependency> Dependencies;
  5. }
  6.  
  7. public class ProjectDependency
  8. {
  9. public Project Project;
  10. public Project Dependency;
  11. }

并且我试图找出一个最新的依赖关系列表的更有效的方法,给出一个新的dependencyIds列表.

所以这里是一个天真的实现:

  1. public void UpdateDependencies(Project p,List<int> newDependencyIds)
  2. {
  3. p.Dependencies.Clear();
  4. foreach (var dependencyId in newDependencyIds)
  5. {
  6. Project d = GetDependency(dependencyId)
  7. p.Dependencies.Add(new ProjectDependency{Project = p,Dependency = d});
  8. }
  9. }

但这里的问题是,即使没有改变,我正在清除所有项目,并在同样的项目上进行插入.

我正在寻找一种优雅的方式来确定差异(已添加什么,被删除了什么),只是进行这些更改,如果一个依赖关系在之前和之后,那么它不会被触动.

解决方法

  1. public void UpdateDependencies(Project p,List<int> newDependencyIds)
  2. {
  3. p.Dependencies.RemoveAll(d => !newDependencyIds.Contains(d.Dependency.Id));
  4. var toAdd = newDependencyIds.Select(d => p.Dependencies.Any(pd => pd.Dependency.Id != d)).ToList();
  5. toAdd.ForEach(dependencyId => p.Dependencies.Add(new ProjectDependency{Project = p,Dependency = GetDependency(dependencyId)}));
  6. }

猜你在找的C#相关文章