簡體   English   中英

實體框架-訪問本身具有外鍵/導航鍵的模型類

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

我有以下模型,可以是相同類型的子代,和/或有許多相同類型的子代。

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

    }

我如何才能通過Id獲取一個未知深度的特定SystemGroupModel ,並包括所有的子代,孫代,曾孫代等等。

這似乎是可行的,這意味着它將建立任何給定的父母以及無限深的孫輩,曾孫級等等的孩子的列表。

這是正確的方法嗎?

首先,我創建了這個新類

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

    public bool WasChecked { get; set; }
}

然后我添加了這段代碼
編輯:更新以包括構建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