0

У меня есть много-ко-многим между родителями и Чайлдс, используя таблицу отношение вызывают эти отношения не поддерживаются автоматически в 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)); 

ответ

2

Похоже, я неправильно понимаю использование ThenInclude, поскольку она относится к суб-сущности. Имея список его можно определить объект для загрузки также в списках, как это:

var parentWithChilds = db.Parents.Include(p => p.ParentChilds) 
    .ThenInclude(p => p.Child) 
    .FirstOrDefault(p => p.Id == 1); 

Visual Studio имеет проблемы с указанием тех перегрузки в IntelliSense, но его там и не будет приводить к ошибкам.

+3

'.ThenInclude' имеет две перегрузки (при использовании свойства навигации коллекции). Один для 'TPreviousProperty' и другой для' ICollection '. Для некоторых людей Visual Studio, кажется, всегда демонстрирует intellisense для варианта «TPreviousProperty» и только показывает методы расширения коллекции, а не модель. Но когда вы вводите имя свойства без автозаполнения, он будет выбирать правильный (например, с '.ThenInclude (p => p.Child)' и не показывать ошибку компилятора. – Tseng

+0

Да, это была проблема, t заметила перегрузку сначала, потому что она отсутствовала в intellisense. – Lion

Смежные вопросы