Entity Framework-доступ к классам моделей с внешним ключом / навигационным ключом

У меня есть следующая модель, которая может быть дочерним ребенком того же типа и/или иметь много детей того же типа.

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; }

    }

Как я могу получить конкретноеSystemGroupModel, Idчто находится на неизвестной глубине, и включают в себя все это дети, внуки, правнуки и т.д.?

1 ответ

  1. Это, по-видимому, работает, что означает, что он будет строить список любого данного родителя, а также детей на неограниченной глубине внуков, правнуков и так далее.

    Это правильный подход?

    Сначала я создал этот новый класс

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

    Затем я добавил этот код
    EDIT: обновлено, чтобы включить цикл, который строит 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;
        }