简体   繁体   中英

EF core 3.1: should I initialize list navigation properties when using eager loading to load related entities?

Consider the following EF core 3.1 data model:

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(); 
    }
}

Consider a scenario where I run the following query, by using eager loading:

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");
        }
}

By looking at some examples, I've noticed that initalizing list navigation properties it's a common practice. In my case, this would lead to something like this:

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

I'm asking whether this is really useful when querying via eager loading.

I have done a few tests and I have verified that the query showed above automatically creates an empty list for a blog having no posts .

Put another way, it seems that even if the Posts navigation property is not initialized to an empty list inside the Blog entity definition, a query using the eager loading doesn't care and does not return a null value for the Posts navigation property.

Is my understanding correct ?

If it does, what is the usefullness (if any) of initializing the Posts navigation property to an empty list when querying the database by using eager loading to load related entities ?

This is not useful and you don't have to do this because you are using eager loading(which is not very efficient if you load a lot of unnecessary data but this is another topic).

However, this is useful in two cases:

  • If you don't use eager loading because Posts property may be null
  • You are creating a new Blog object which is not yet saved in database and want to add a new Post into it. In this case Posts property must be initialized prior Posts.Add(post) is called because null ref unitialized exception will be thrown.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM