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.configuration.LazyLoadingEnabled
。
默认情况下,此设置为true,因此如果未更改默认设置,动态代理将执行延迟加载。要使用延迟加载,需要在POCO类中实现两件事
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();