EF core 3.1: должен ли я инициализировать свойства навигации по списку при использовании быстрой загрузки для загрузки связанных объектов?

#c# #asp.net-core #.net-core #entity-framework-core #ef-core-3.1

#c# #asp.net-core #.net-core #entity-framework-core #ef-core-3.1

Вопрос:

Рассмотрим следующую модель данных EF core 3.1:

 public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Author { get; set; }
    public DateTime Date { get; set; }
    public Blog Blog { get; set; }
    public int BlogId { get; set; }
}

public class BlogAppContext: DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=DB_BLOG_APP;Integrated Security=SSPI;MultipleActiveResultSets=True");
    }

    public DbSet<Post> Posts { get; set; }
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasMany(x => x.Posts)
            .WithOne(x => x.Blog)
            .HasForeignKey(x => x.BlogId)
            .IsRequired(); 
    }
}
  

Рассмотрим сценарий, в котором я выполняю следующий запрос, используя быструю загрузку:

 static void Main(string[] args)
{
        using var context = new BlogAppContext();
        
        var blogs = context.Blogs.Include(x => x.Posts).ToList();

        foreach (var blog in blogs)
        {
            Console.WriteLine($"There are {blog.Posts.Count} posts");
        }
}
  

Рассмотрев некоторые примеры, я заметил, что инициализация свойств навигации по списку является обычной практикой. В моем случае это привело бы к чему-то вроде этого:

 public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Post> Posts { get; set; } = new List<Post<();
}
  

Я спрашиваю, действительно ли это полезно при запросе с помощью быстрой загрузки.

Я провел несколько тестов и убедился, что приведенный выше запрос автоматически создает пустой список для блога, в котором нет записей.

Другими словами, кажется, что даже если свойство Posts навигации не инициализировано для пустого списка внутри определения Blog сущности, запрос, использующий нетерпеливую загрузку, не заботится и не возвращает null значение для свойства Posts навигации.

Правильно ли я понимаю ?

Если это так, какова полезность (если таковая имеется) инициализации свойства Posts навигации для пустого списка при запросе базы данных с помощью быстрой загрузки для загрузки связанных объектов?

Комментарии:

1. Вы пробовали сохранять Blog с Posts помощью being null ?

Ответ №1:

Это бесполезно, и вам не нужно этого делать, потому что вы используете быструю загрузку (что не очень эффективно, если вы загружаете много ненужных данных, но это уже другая тема).

Однако это полезно в двух случаях:

  • Если вы не используете быструю загрузку, поскольку Posts свойство может быть null
  • Вы создаете новый Blog объект, который еще не сохранен в базе данных, и хотите добавить Post в него новый. В этом случае Posts свойство должно быть инициализировано перед Posts.Add(post) вызовом, потому что будет выдано неинициализированное исключение null ref.

Комментарии:

1. полностью имеет смысл.