使用DbContext进行延迟加载

Łuk*_*ran 4 c# linq linq-to-entities entity-framework entity-framework-4

我有这个:

Post post = GetPost(postID);

if (post.User.UserID == userID)
    return true;
Run Code Online (Sandbox Code Playgroud)

和GetPost():

public Post GetPost(int postID)
{
    var ctx = new ForumContextContainer();
    var post = (from p in _ctx.PostSet
                where p.PostID == postID
                select p).FirstOrDefault();
    return post;
}
Run Code Online (Sandbox Code Playgroud)

并发布自己:

public partial class Post
{
    public int PostID { get; set; }
    public string Text { get; set; }
    public System.DateTime Created { get; set; }
    public Nullable<int> Like { get; set; }
    public Nullable<int> Dislike { get; set; }

    public User User { get; set; }
    public Thread Thread { get; set; }
    public ICollection<Attachment> Attachment { get; set; }
    public ICollection<Reported> Reported { get; set; }
    public ICollection<Tag> Tag { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在您可能已经猜到我想比较用户是否创建了帖子.问题是这里的用户为空.我的问题是,我是否必须明确加载用户,每次调用GetPost()或我可以用另一种方式.

问,因为,每次为线程中的每个帖子加载线程时都要这样做,对于每个用户浏览线程..好吧,你可以看到数学.

Lad*_*nka 8

如果您将导航属性设置为虚拟,并且您将在整个处理过程中保持上下文活动,EF将在您第一次访问它时加载导航属性 - 即延迟加载.如果您不使虚拟属性或计划关闭GetPost方法中的上下文(上下文是一次性的!),则必须显式加载要通过Include方法使用的每个导航属性.