实体框架中的父和子链接

本文关键字:链接 框架 实体 | 更新日期: 2023-09-27 18:10:07

我正在创建一个类似于任务列表的系统web应用程序。

  • 用户可以创建任务
  • 用户可以在任何Task中创建Task。
  • 用户可以在任务
  • 中创建任务
  • 用户可以查看第一个任务,并查看与该任务链接的所有任务。

我已经创建了一个简单的父子关系。一旦我通过了第一关,我发现它是不可能的?

我希望能够查看原始父任务以及其中的所有其他父和子任务。

到目前为止,Task有一个任务集合。

我想要做的是查看原始父类的所有兄弟类。

   modelBuilder.Entity<Task>()
            .HasMany(x => x.Children)
            .WithOptional()
            .HasForeignKey(x => x.ParentID);

实体框架中的父和子链接

查询数据库时,请执行以下操作:

var tasks = from t in db.Tasks.Include("Parent")
            where t.Id //... your logic here
            select t;

,你需要扩展你的Task类来包含父属性:

public virtual Task Parent { get; set; }

,然后映射关系:

modelBuilder.Entity<Task>()
            .HasOptional(x => x.Parent)
            .WithMany(x => x.Children)
            .HasForeignKey(x => x.ParentID);

上面的查询告诉EF为每个返回的Task带来父Task。

一种解决方案可能是使用两个外键。一个外键是IDRootTask,另一个是IDParentTask。

第一个IDRootTask是第一个任务的ID,因此要获取该组的所有任务。第二个FK, IDRootParent可以用来获取父任务的任务。这样,就不需要递归函数来获取父元素和父元素的父元素。

另一种选择,如果你想要所有的任务都低于一个确定的任务,那么你需要在数据库中存储一个树,这允许你知道所有的后代或所有的祖先。