繁体   English   中英

EF 核心 3.1:在使用急切加载加载相关实体时,我应该初始化列表导航属性吗?

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

考虑以下 EF 核心 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导航属性初始化为空列表有什么用处(如果有)?

这没有用,您不必这样做,因为您使用的是预先加载(如果加载大量不必要的数据,效率不是很高,但这是另一个主题)。

但是,这在两种情况下很有用:

  • 如果您不使用预先加载,因为Posts属性可能为null
  • 您正在创建一个尚未保存在数据库中的新Blog对象,并希望向其中添加一个新Post 在这种情况下,必须在Posts.Add(post)调用之前初始化Posts属性,因为将抛出 null ref 单元化异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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