Ядро 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);
и это вернет вам модель с отношениями, которые вы включаете.