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, запрос, использующий нетерпеливую загрузку, не заботится и не< /strong> вернуть значение null для свойства навигации Posts.

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

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


person Enrico Massone    schedule 18.09.2020    source источник
comment
Пробовали ли вы сохранить Blog с Posts на null?   -  person Deivydas Voroneckis    schedule 18.09.2020


Ответы (1)


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

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

  • Если вы не используете активную загрузку, потому что свойство Posts может быть null
  • Вы создаете новый объект Blog, который еще не сохранен в базе данных, и хотите добавить в него новый объект Post. В этом случае свойство Posts должно быть инициализировано до вызова Posts.Add(post), потому что будет выдано унитаризованное исключение null ref.
person Deivydas Voroneckis    schedule 18.09.2020
comment
полностью имеет смысл. - person Enrico Massone; 19.09.2020