Я использую Entity Framework Core 2.0.0. Когда я запрашиваю свой контекст с помощью оператора .Include () для свойств навигации объекта сопоставления «многие ко многим», контекст возвращает все дочерние элементы потомков дочерних элементов ... для свойств навигации этого объекта сопоставления.
Пример:
MapExerciseWorkout queryResult;
using (var context = new FitnessContext("MySqlConnectionString"))
{
queryResult = context
.MapExerciseWorkout.AsNoTracking()
.Include(i => i.Exercise).AsNoTracking()
.Include(i => i.Workout).AsNoTracking()
.FirstOrDefault();
}
var result = JsonConvert.SerializeObject(queryResult,
new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
Formatting = Formatting.Indented
});
Я могу подтвердить, что навигационные свойства Exercise и Workout, которые НЕ связаны с объектом сопоставления «MapExericseWorkout», например ExerciseHistories и WorkoutHitories, не загружаются и поэтому возвращаются как null .
Я ожидаю, что «результатом» запроса из приведенного выше примера будет:
{
"Id": 1,
"Workout": {
"Id": 1,
"Name": "WorkoutA",
"MapExerciseWorkout": null,
"WorkoutHistories": null,
"OwnerGuid": "00000000-0000-0000-0000-000000000000"
},
"WorkoutId": 1,
"Exercise": {
"Id": 1,
"Name": "ExerciseA",
"ExerciseType": 0,
"MapExerciseWorkout": null,
"ExerciseHistories": null,
"OwnerGuid": "00000000-0000-0000-0000-000000000000"
},
"ExerciseId": 1,
"OwnerGuid": "00000000-0000-0000-0000-000000000000"
}
Но вместо этого получите полностью рекурсивный MapExerciseWorkout для включенного упражнения и тренировки:
{
"Id": 1,
"Workout": {
"Id": 1,
"Name": "WorkoutA",
"MapExerciseWorkout": [{"Id":2,"WorkoutId":1,"Exercise":{"Id":2,"Name":"ExerciseB","ExerciseType":0,"MapExerciseWorkout":[{"Id":4,"Workout":{"Id":2,"Name":"WorkoutB","MapExerciseWorkout":[{"Id":3,"WorkoutId":2,"Exercise":{"Id":1,"Name":"ExerciseA","ExerciseType":0,"MapExerciseWorkout":[],"ExerciseHistories":null,"OwnerGuid":"00000000-0000-0000-0000-000000000000"},"ExerciseId":1,"OwnerGuid":"00000000-0000-0000-0000-000000000000"}],"WorkoutHistories":null,"OwnerGuid":"00000000-0000-0000-0000-000000000000"},"WorkoutId":2,"ExerciseId":2,"OwnerGuid":"00000000-0000-0000-0000-000000000000"}],"ExerciseHistories":null,"OwnerGuid":"00000000-0000-0000-0000-000000000000"},"ExerciseId":2,"OwnerGuid":"00000000-0000-0000-0000-000000000000"}],
"WorkoutHistories": null,
"OwnerGuid": "00000000-0000-0000-0000-000000000000"
},
"WorkoutId": 1,
"Exercise": {
"Id": 1,
"Name": "ExerciseA",
"ExerciseType": 0,
"MapExerciseWorkout": [{"Id":3,"Workout":{"Id":2,"Name":"WorkoutB","MapExerciseWorkout":[{"Id":4,"WorkoutId":2,"Exercise":{"Id":2,"Name":"ExerciseB","ExerciseType":0,"MapExerciseWorkout":[{"Id":2,"Workout":{"Id":1,"Name":"WorkoutA","MapExerciseWorkout":[],"WorkoutHistories":null,"OwnerGuid":"00000000-0000-0000-0000-000000000000"},"WorkoutId":1,"ExerciseId":2,"OwnerGuid":"00000000-0000-0000-0000-000000000000"}],"ExerciseHistories":null,"OwnerGuid":"00000000-0000-0000-0000-000000000000"},"ExerciseId":2,"OwnerGuid":"00000000-0000-0000-0000-000000000000"}],"WorkoutHistories":null,"OwnerGuid":"00000000-0000-0000-0000-000000000000"},"WorkoutId":2,"ExerciseId":1,"OwnerGuid":"00000000-0000-0000-0000-000000000000"}],
"ExerciseHistories": null,
"OwnerGuid": "00000000-0000-0000-0000-000000000000"
},
"ExerciseId": 1,
"OwnerGuid": "00000000-0000-0000-0000-000000000000"
}
Возвращенные вложенные дочерние элементы MapExerciseWorkout не являются неопределенными, но содержат слишком много данных, и я не хочу и не нуждаюсь в их возврате.
Я безуспешно пробовал следующее:
- Согласно этому ТАКому вопросу, я добавил .AsNoTracking () к запросу
- Я удалил ключевое слово "virtual" из всех свойств навигации
- Я обернул запрос контекста в оператор использования, продвигающий удаленный контекст
- Я хотел отключить ленивую загрузку для контекста, но EF Core, похоже, не предлагает его специально, поэтому нет необходимости отключать его
Как я могу включить только Упражнение и Тренировку без их свойств навигации, чтобы включить их соответствующие MapExerciseWorkout?