Мне нужно обновить запись, которая имеет дочерние объекты.Действие обновления должно очистить ссылки на дочерний объект, а затем каскадно удалить существующие дочерние объекты.
У меня есть идентификатор объекта и запрос для записи, но идентификатор дочернего объекта либо неверен, либо создает дубликаты с неполными данными.
Модели:
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
}
]
}
Как правильно получить Родителя со всеми дочерними данными, чтобы я мог очистить дочернюю ссылку в родительском и каскадно удалить все дочерние записи из БД?