Что такое навигационное свойство в Entity Framework?

«Что такое навигационное свойство в Entity Framework?» — вопрос из категории Entity Framework, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Навигационное свойство (Navigation Property) в Entity Framework — это свойство в классе сущности, которое представляет связь с другой сущностью (или коллекцией сущностей) в модели данных. Оно позволяет удобно перемещаться (навигация) по графу связанных объектов, не написавая явных JOIN-запросов.

Типы навигационных свойств:

  1. Ссылочное навигационное свойство: Указывает на одну связанную сущность (отношение "один-ко-многим" или "один-к-одному").
  2. Коллекционное навигационное свойство: Представляет коллекцию связанных сущностей (отношение "один-ко-многим" или "многие-ко-многим").

Пример модели с навигационными свойствами:

public class Blog // Главная сущность
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    // Коллекционное навигационное свойство: у одного Blog много Post
    public List<Post> Posts { get; set; } 
}

public class Post // Зависимая сущность
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; } // Внешний ключ (foreign key)
    // Ссылочное навигационное свойство: каждый Post принадлежит одному Blog
    public Blog Blog { get; set; } 
}

Использование в запросах (Eager Loading):

// Загрузить блоги вместе со всеми связанными постами за один запрос
var blogsWithPosts = context.Blogs
                             .Include(b => b.Posts) // Используем Include для навигационного свойства
                             .ToList();

// После загрузки можно навигировать по объектам
foreach (var blog in blogsWithPosts)
{
    Console.WriteLine($"Blog: {blog.Url}");
    foreach (var post in blog.Posts) // Используем навигационное свойство Posts
    {
        Console.WriteLine($"  - Post: {post.Title}");
    }
}

Как это работает: EF Core использует эти свойства, чтобы понять связи между таблицами в БД, и автоматически генерирует соответствующие SQL-запросы с JOIN. Внешние ключи (как BlogId в Post) обычно представляют собой свойства внешнего ключа, которые работают в паре с навигационными свойствами.