Проблема з EF Core під час використання Include може виникати в контексті використання many-to-many зв’язку між сутностями. У цій статті ми розглянемо типову ситуацію, коли під час виконання запиту до бази даних з’являється виняток, який не завжди легко зрозуміти і виправити.
Перш ніж перейти до детального розгляду проблеми, давайте розберемося з тим, що таке EF Core та Include. Entity Framework (EF) Core – це ORM (Object-Relational Mapping) для .NET, який дозволяє робити розробку баз даних більш зручною і продуктивною. Include – це метод EF Core, який використовується для завантаження пов’язаних даних (зв’язаних об’єктів) з бази даних в одному запиті.
Тепер перейдемо до розгляду конкретної проблеми, яка може виникнути при використанні EF Core та Include. Припустимо, що у нас є DbContext, до якого ми додаємо кілька сутностей, кожна з яких бере участь у відношенні багато-до-багатьох. Після збереження змін ми можемо успішно отримати екземпляри цих відносин (наприклад, NameConstituent у нашій схемі) без проблем:
1 2 3 4 |
var transferDb = new TransferDb( transferDbName ); ...додано дані без проблем transferDb.SaveChanges(); var test = transferDb.NameConstituents.Include( nc => nc.Name ).ToList(); |
Однак, якщо ми відразу створимо новий екземпляр DbContext і виконаємо той самий код отримання даних, то виникне виняток:
1 2 3 |
var db2 = new TransferDb( transferDbName ); // наступний рядок генерує виняток var test2 = db2.NameConstituents.Include(nc => nc.Name).ToList(); |
Повідомлення про виняток: Data is Null. This method or property cannot be called on Null values. Нажаль, це повідомлення нічого не означає для нас. Ми також можемо переглянути DbSet у віконні спостереження. У першому DbContext кожен запис показує як значення зовнішнього ключа (цілі числа), так і посилання на зовнішню сутність, на яку вказує цей ключ. Однак в другому DbContext ми бачимо лише цілі числа зовнішніх ключів – немає посилань на класи (властивості показуються як null… що, ймовірно, спробує сказати повідомлення про помилку). Ми не розуміємо, чому пов’язані сутності, видимі в першому DbContext, не видно в другому.