【发布时间】:2020-06-10 19:17:24
【问题描述】:
我正在做一个简单的项目管理系统,我有一个项目的模型:
public class Project
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Title { get; set; }
public string Notes { get; set; }
public DateTime Created { get; set; }
public DateTime? Deadline { get; set; }
public bool Completed { get; set; }
public List<Project> ChildProjects { get; set; }
}
在OnModelCreating()中是这样定义的:
modelBuilder.Entity<Project>()
.HasMany(c => c.ChildProjects)
.WithOne()
.HasForeignKey(p => p.ParentId);
如果需要更改,我想要一些功能来更改所有祖先项目的Completed-property。 IE。如果特定父项目的所有同级子项目都设置为已完成,则父项目的Completed-属性应自动设置为true。然后对祖父母、曾祖父母等进行相同的检查。
这就是我所拥有的:
在创建或更新子项目时,我也在这样做:
// "project" is the current project we are creating or updating.
if (project.ParentId != null)
{
List<Project> allProjects = await db.Projects.ToListAsync();
List<Project> siblings = allProjects.Where(s => s.ParentId == project.ParentId).ToList();
SetParentCompleteness(allProjects, project.Id, siblings.All(c => c.Completed));
db.UpdateRange(allProjects);
}
SetParentCompleteness()-方法:
private void SetParentCompleteness(List<Project> allProjects, int id, bool completed)
{
Project project = allProjects.Where(p => p.ParentId == id).FirstOrDefault();
if (project != null)
{
project.Completed = completed;
db.Update(project);
SetParentCompleteness(allProjects, project.Id, completed);
}
return;
}
我知道UpdateRange(the_entire_database) 不是一个好主意。如何列出需要更改的项目?
【问题讨论】:
-
似乎是合理的逻辑,但你为什么要写
db.Projects.ToList()这是一个非常糟糕的主意。不要做那么多急切的评价。此外,你可以得到这样的兄弟姐妹。project.Parent.Children这要简单得多。你需要延迟加载 -
@AluanHaddad 如果我想要数据库中的所有项目,
db.Projects.ToListAsync()的替代方案是什么? -
您不需要全部,只需要与正在更新的项目相关的那些
标签: c# recursion tree asp.net-core-mvc