简体   繁体   English

实体框架-访问本身具有外键/导航键的模型类

[英]Entity Framework - Accessing Model classes that have foreign/navigation key to themselves

I have the following Model, which can be a child of the same type, and/or have many children of the same type. 我有以下模型,可以是相同类型的子代,和/或有许多相同类型的子代。

public class SystemGroupModel
    {
        public int Id { get; set; }

        public int? ParentSystemGroupModelId { get; set; }

        [ForeignKey("ParentSystemGroupModelId")]
        public virtual SystemGroupModel ParentSystemGroupModel { get; set; }

        [InverseProperty("ParentSystemGroupModel")]
        public virtual ICollection<SystemGroupModel> SubSystemGroupModels { get; set; }

    }

How can I get a specific SystemGroupModel by Id that is at an unknown depth, and include all of it's children, grandchildren, great-grandchildren, etc.? 我如何才能通过Id获取一个未知深度的特定SystemGroupModel ,并包括所有的子代,孙代,曾孙代等等。

This appears to be working, which means it will build a list of any given parent, as well as children at an unlimited depth of grandchildren, great-grandchildren, and so on. 这似乎是可行的,这意味着它将建立任何给定的父母以及无限深的孙辈,曾孙级等等的孩子的列表。

Is this the right approach? 这是正确的方法吗?

First I created this new class 首先,我创建了这个新类

public class SystemGroupWorkingClass
{
    public SystemGroupModel SystemGroupModel { get; set; }

    public bool WasChecked { get; set; }
}

Then I added this code 然后我添加了这段代码
EDIT: Updated to include the loop that builds List<SystemGroupWorkingClass> 编辑:更新以包括构建List<SystemGroupWorkingClass>的循环

List<SystemGroupWorkingClass> tempListSystemGroups = new List<SystemGroupWorkingClass>();

//Get the SystemGroups that were selected in the View via checkbox
foreach (var systemGroupVM in viewModel.SystemGroups)
{
      if (systemGroupVM.Selected == true)
      {
           SystemGroupModel systemGroupModel = await db.SystemGroupModels.FindAsync(systemGroupVM.Id);

           SystemGroupWorkingClass systemGroupWorkingClass = new SystemGroupWorkingClass();
           systemGroupWorkingClass.SystemGroupModel = systemGroupModel;
           systemGroupWorkingClass.WasChecked = false;
           systemGroupWorkingClass.Selected = true;

           //Make sure tempListSystemGroups does not already have this systemGroupWorkingClass object
           var alreadyAddedCheck = tempListSystemGroups
                            .FirstOrDefault(s => s.SystemGroupModel.Id == systemGroupVM.Id);

           if (alreadyAddedCheck == null)
           {
               tempListSystemGroups.Add(systemGroupWorkingClass);
           }
       }
}


    for (int i = 0; i < tempListSystemGroups.Count; i++)
    {
        if (tempListSystemGroups[i].WasChecked == false)
        {
            SystemGroupModel systemGroupModel2 = await db.SystemGroupModels.FindAsync(tempListSystemGroups[i].SystemGroupModel.Id);

            //Get the children, if there are any, for the current parent
            var subSystemGroupModels = systemGroupModel2.SubSystemGroupModels
                    .ToList();

            //Loop through the children and add to tempListSystemGroups
            //The children are added to tempListSystemGroups as it is being iterated over
            foreach (var subSystemGroupModel in subSystemGroupModels)
            {
                SystemGroupModel newSystemGroupModel = await db.SystemGroupModels.FindAsync(subSystemGroupModel.Id);

                SystemGroupWorkingClass subSystemGroupWorkingClass = new SystemGroupWorkingClass();
                subSystemGroupWorkingClass.SystemGroupModel = newSystemGroupModel;
                subSystemGroupWorkingClass.WasChecked = false;

                tempListSystemGroups.Add(subSystemGroupWorkingClass);
            }
        }

        //Mark the parent as having been checked for children
        tempListSystemGroups[i].WasChecked = true;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM