Как правильно найти все дочерние объекты, удалить связь с родителем и удалить их? - PullRequest
0 голосов
/ 21 мая 2019

Мне нужно обновить запись, которая имеет дочерние объекты.Действие обновления должно очистить ссылки на дочерний объект, а затем каскадно удалить существующие дочерние объекты.

У меня есть идентификатор объекта и запрос для записи, но идентификатор дочернего объекта либо неверен, либо создает дубликаты с неполными данными.

Модели:

LcReport.cs

public class LcReport
{
    [Key]
    public int Id { get; set; }
    public string Ou { get; set; }
    public string CourseName { get; set; }
    public DateTime DateTimeSubmittedUtc { get; set; }
    public bool ReportCompleted { get; set; }
    public string Status { get; set; }
    public ICollection<LcModule> Modules { get; set; }
}

LcModule.cs

public class LcModule
{
    [Key]
    public int Id { get; set; }
    public string ModuleId { get; set; }
    public string Title { get; set; }
    public ICollection<LcTopic> Topics { get; set; }
}

LcTopic.cs

public class LcTopic
{
    [Key]
    public int Id { get; set; }
    public int TopicId { get; set; }
    public string Title { get; set; }
    public string Url { get; set; }
    public int StatusCode { get; set; }
    public string StatusDescription { get; set; }
    public ICollection<LcTopicLink> Links { get; set; }
}

LcTopicLinks.cs

public class LcTopicLink
{
    [Key]
    public int Id { get; set; }
    public string Url { get; set; }
    public string Text { get; set; }
    public int StatusCode { get; set; }
    public string StatusDescription { get; set; }
    public string Target { get; set; }
}

В моей локальной базе данных sql в настоящее время у меня есть одна запись для LcReport со ссылкой на единственный LcModule.

Я пробовал следующее:

var originalReport = _context.LcReports
            .FirstOrDefault(i => i.Id == vm.Id);

Возвращает

{
   "Id":1,
   "Ou":"7387",
   "CourseName":null,
   "DateTimeSubmittedUtc":"2019-05-21T14:52:52.3413636",
   "ReportCompleted":false,
   "Status":null,
   "Modules":[
      {
         "Id":0,
         "ModuleId":"3450",
         "Title":"Syllabus",
         "Topics":[
            {
               "Id":0,
               "TopicId":3451,
               "Title":"stackoverflow",
               "Url":"stackoverflow.html",
               "StatusCode":200,
               "StatusDescription":"OK",
               "Links":[
                  {
                     "Id":0,
                     "Url":"stackoverflow.html",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow.html",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow.html",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  }
               ]
            },
            {
               "Id":0,
               "TopicId":3452,
               "Title":"stackoverflow",
               "Url":"stackoverflow",
               "StatusCode":200,
               "StatusDescription":"OK",
               "Links":[

               ]
            }
         ]
      }
   ]
}

Все в родительской записи LcReport верное.Однако для дочерних объектов Id неверен.

Я изменил запрос:

var originalReport = _context.LcReports
                .Include(m => m.Modules)
                .FirstOrDefault(i => i.Id == updatedReport.Id);

Это приводит к приведенному выше плюс дополнительная запись LcModel с правильным Id, но все остальное неверно.

{
   "Id":1,
   "Ou":"7387",
   "CourseName":null,
   "DateTimeSubmittedUtc":"2019-05-21T14:52:52.3413636",
   "ReportCompleted":false,
   "Status":null,
   "Modules":[
      {
         "Id":0,
         "ModuleId":"3450",
         "Title":"Syllabus",
         "Topics":[
            {
               "Id":0,
               "TopicId":3451,
               "Title":"stackoverflow",
               "Url":"stackoverflow.html",
               "StatusCode":200,
               "StatusDescription":"OK",
               "Links":[
                  {
                     "Id":0,
                     "Url":"stackoverflow.html",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow.html",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow.html",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  },
                  {
                     "Id":0,
                     "Url":"stackoverflow",
                     "Text":"stackoverflow",
                     "StatusCode":0,
                     "StatusDescription":null,
                     "Target":"_blank"
                  }
               ]
            },
            {
               "Id":0,
               "TopicId":3452,
               "Title":"stackoverflow",
               "Url":"stackoverflow",
               "StatusCode":200,
               "StatusDescription":"OK",
               "Links":[

               ]
            }
         ]
      },
      {
         "Id":1,
         "ModuleId":"3450",
         "Title":"Syllabus",
         "Topics":null
      }
   ]
}

Как правильно получить Родителя со всеми дочерними данными, чтобы я мог очистить дочернюю ссылку в родительском и каскадно удалить все дочерние записи из БД?

...