Entity Framework Core возвращает все вложенные дочерние элементы при использовании .Include () в запросе сущности сопоставления «многие ко многим». - PullRequest
0 голосов
/ 08 мая 2018

Я использую 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...