Entity framework 实体框架代码中的实体关系优先

Entity framework 实体框架代码中的实体关系优先,entity-framework,code-first,Entity Framework,Code First,假设我有两个实体模型- public class Blog { [Key] public int BlogId { get; set; } public string BlogName { get; set; } public virtual ICollection<Post> Posts { get; set; } } public class Post { [Key] public int PostId { get; set;

假设我有两个实体模型-

public class Blog
{
    [Key]
    public int BlogId { get; set; }
    public string BlogName { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}


public class Post
{
    [Key]
    public int PostId { get; set; }
    public string PostName { get; set; }
    public int BlogId { get; set; }

    [ForeignKey("BlogId")]
    public virtual Blog Blog { get; set; }
}
代码检索博客和所有帖子。但是如果这个博客下有成千上万的帖子呢?这将是一个性能问题

默认情况下不加载帖子有什么诀窍吗?我不想从
Blog
中删除
Posts
属性


谢谢。

您可以控制哪些子级加载:


您可以通过两种方式实现这一点

  • 延迟加载
  • 显式加载
  • 延迟加载-DbContext有一个配置设置,可以启用延迟加载
    DbContext.configuration.LazyLoadingEnabled
    。 默认情况下,此设置为true,因此如果未更改默认设置,动态代理将执行延迟加载。要使用延迟加载,需要在POCO类中实现两件事

  • 您的POCO类必须是公开的,而不是密封的
  • 要延迟加载的导航属性也必须标记为虚拟(您已经这样做了),以便Entity Framework可以覆盖这些属性以包含延迟加载逻辑
  • 2-显式加载-显式加载类似于延迟加载,即在加载主数据后,分别加载相关数据。然而,与延迟加载不同,它不会自动发生在您身上;您需要调用一个方法来加载数据

    显式加载是使用
    DbContext.Entry
    方法实现的。Entry方法允许您访问
    DbContext
    中有关实体的所有信息。这超出了存储在实际实体属性中的值,包括实体的状态以及从数据库检索时每个属性的原始值

    例:


    好吧,如果你打开了延迟加载,它不会提前加载Posts集合,但这只是延迟完全加载,直到你访问它。你能解释一下为什么你不想删除这个属性吗?如何打开延迟加载?你怎么知道它已经在拉所有的帖子了?应该已经是了,因为你的收藏是虚拟的。
    var blog = dbContext.Blogs.Where(r => r.BlogId == 1).FirstOrDefault();
    
    var blogWithSomeChildren = dbContext.Blogs
                                        .Select(b => new
                                         {
                                             blog = b,
                                             selectedPosts = b.Posts.Where(p => p.PostId > 500) // or whatever criteria you want...
                                         })
                                        .Single(b => b.BlogId ==1);
    
    var blog = dbContext.Blogs.Where(r => r.BlogId == 1).FirstOrDefault();
    
    context.Entry(blog)
    .Collection(d => d.Posts)
    .Load();