У меня есть много-ко-многим между родителями и Чайлдс, используя таблицу отношение вызывают эти отношения не поддерживаются автоматически в EF Ядра еще:Включить Entity родового списка собственности в ASP.NET EntityFramework Ядра
class Parent{
[Key]
public int Id{get;set;}
public List<ParentChild> ParentChilds{get;set;}
}
class Child{
[Key]
public int Id{get;set;}
public List<ParentChild> ParentChilds{get;set;}
}
class ParentChild{
public int ParentId{get;set;}
public Parent Parent{get;set;}
public int ChildId{get;set;}
public Child Child{get;set;}
}
Для редактирования родителя мне нужно получить ВСЕ его детей. Похоже, работа для Include()
var db = new MyDbContext();
var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
.FirstOrDefault(p => p.Id == 1);
Это дало мне список ParentChild
istances. Но объект ParentChild
не загружается автоматически, поэтому у меня есть только идентификатор дочернего элемента, но не сам объект Child, который мне нужен. Я нашел ThenInclude
, который, как представляется, предназначены для таких случаев и из примеров, как this я сделал следующее:
var parentWithChilds = db.Parents.Include(p => p.ParentChilds)
.ThenInclude(p => p.Select(x => x.Child))
.FirstOrDefault(p => p.Id == 1);
Но он бросает исключение:
Выражение свойство «р => {из ParentChild x in p select [x] .Child => FirstOrDefault()} 'недопустим. Выражение должно представлять доступ к свойствам: 't => t.MyProperty'.
Как это можно сделать? Я хотел бы избежать ненужных запросов как извлечение объект вручную следующим образом:
user.ParentChilds.ForEach(pc => pc.Child = db.Childs.FirstOrDefault(x => x.Id == pc.ChildId));
'.ThenInclude' имеет две перегрузки (при использовании свойства навигации коллекции). Один для 'TPreviousProperty' и другой для' ICollection '. Для некоторых людей Visual Studio, кажется, всегда демонстрирует intellisense для варианта «TPreviousProperty» и только показывает методы расширения коллекции, а не модель. Но когда вы вводите имя свойства без автозаполнения, он будет выбирать правильный (например, с '.ThenInclude (p => p.Child)' и не показывать ошибку компилятора. –
Tseng
Да, это была проблема, t заметила перегрузку сначала, потому что она отсутствовала в intellisense. – Lion