Ядро Entity Framework: Как проверить правильность загрузки навигации при использовании хранилища данных в памяти

В ядре платформы сущностей существует интересная особенность:

Entity Framework Core автоматически исправит свойства навигации для любых других объектов, которые ранее были загружены в экземпляр контекста. Таким образом, даже если вы не включите данные для свойства навигации в явном виде, свойство все равно может быть заполнено, если некоторые или все связанные объекты были загружены ранее.

Это хорошо в некоторых случаях. Однако в настоящий момент я пытаюсь смоделировать отношение "многие ко многим" с помощью расширенных синтаксических дополнений и не хочу проверять, что созданное мной отображение работает хорошо.

Но я на самом деле не могу этого сделать, так как, если, скажем, у меня есть что-то вроде:

class Model1{
   ... // define Id and all other stuff
   public ICollection<Model2> Rel {get; set;}
}

Model1 m1 = new Model1(){Id=777};
m1.Rel.Add(new Model2());
ctx.Add(m1);
ctx.SaveChanges()

var loaded = ctx.Model1s.Single(m => m.Id == 777);

так из-за авто-исправления loaded.Rel поле уже будет заполнено, даже если я ничего не включу. Так что с этой функцией я не могу ничего проверить. Не могу проверить, что я использую правильное отображение, и мои дополнения к Include работает правильно. Имея это в виду, что я должен изменить, чтобы иметь возможность проверить правильность работы моих навигационных свойств?


Я создаю тестовый сценарий, который должен проходить, но сейчас терпит неудачу. Точный код можно найти там

Я использую.Net Core 2.0 Preview 1 и EF Core в соответствии с этим.

1 ответ

Решение

Если вы хотите протестировать свойства навигации с помощью хранилища данных в памяти, вам необходимо загрузить свои элементы в "неотслеживаемом" режиме, используя AsNoTracking() расширение.

Итак, для вашего случая, еслиvar loaded = ctx.Model1s.Single(m => m.Id == 777); вернуть вам товар с отношениями, чем если переписать на:
var loaded = ctx.Model1s.AsNoTracking().Single(m => m.Id == 777); это вернет вам сырой предмет без deps.

Итак, если вы хотите проверить Include опять же, вы могли бы написать что-то вроде ctx.Model1s.AsNoTracking().Include(m => m.Rel).Single(m => m.Id == 777); и это вернет вам модель с отношениями, которые вы включаете.

Другие вопросы по тегам