c# - 使用 DbContext 进行延迟加载

标签 c# linq entity-framework entity-framework-4 linq-to-entities

我有这个:

Post post = GetPost(postID);

if (post.User.UserID == userID)
    return true;

和 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;
}

并发布自己:

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

现在您可能猜到了,我想比较用户是否创建了帖子。问题是此处的用户为空。 我的问题是,我是否必须在每次调用 GetPost() 时显式加载用户,或者我可以通过其他方式进行。

问是因为,假设每次为线程中的每个帖子、每个用户浏览线程加载线程时都这样做。好吧,你可以看到数学。

最佳答案

如果您将导航属性设为虚拟,并且您将在整个处理过程中保持上下文处于事件状态,EF 将在您第一次访问它时加载导航属性 - 这就是延迟加载。如果您不将属性设置为虚拟属性,或者如果您打算在 GetPost 方法中关闭上下文(上下文是一次性的!),您必须通过 Include 显式加载要使用的每个导航属性> 方法。

关于c# - 使用 DbContext 进行延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001002/

相关文章:

c# - 公开 LINQ 查询的 protected 集合

c# - 我自己的 OrderBy 函数

c# - Linq GroupBy 子句不包括计数为零的项目

c# - Entity Framework 无法与 MySql 一起使用

C# 如何从二进制文件中删除换行符?

c# - 将 List<T> 转换为嵌套 Dictionary<string, Dictionary<string, T>

C# 无法在 IEnumerable 中设置属性

c# - mvc5 : Cannot access a disposed object. asp.net mvc5 使用统一

MySQL + Entity Framework : Can't delete object

c# - 如何在 Entity Framework 中映射 CONTAINSTABLE 函数(代码优先)?