在 BaseScript (DbContext) 中加载相关实体

Loading related entities in BaseScript (DbContext)

我有一个 BaseScript,在脚本中有一个不加载相关实体的 GetAll。

在 DbContext 中禁用了 LazyLodingEnabled (false)。

遵循一些代码来理解我的问题。在此示例中,当我想按语言获取消息时,它不会加载用户和消息视图。

BaseScript

public abstract class BaseScript<TEntity> where TEntity : EntityBase
{
    public virtual IEnumerable<TEntity> GetAll()
    {
        using (EntityDbContext ctx = new EntityDbContext())
        {
            return ctx.Set<TEntity>().ToList();
        }
    }
}

消息脚本

public class MessageScript : BaseScript<Message>
    {
        public IEnumerable<Message> GetAllByLanguagePublic(string language)
        {
            return this.GetAllPublic().Where(x => x.Language == language).ToList();
        }
    }

消息实体:

public class Message : EntityBase
{
    public string Text { get; set; }
    public string Language { get; set; }

    public virtual User User { get; set; }
    public Guid UserId { get; set; }

    public virtual ICollection<MessageView> MessageViews { get; set; }
}

我想你的问题是 "Why aren't User and MessageViews loaded?" 如果是这样,你就是在回答你自己。如果禁用延迟加载,则必须显式加载这些属性,使用 Include(例如):

也许在你的 BaseScript.GetAll 中你想要 return 一个 IQueryable 而不是 IEnumerable 所以查询将不会被执行(不要调用 ToList()).然后,在您的 GetAllByLanguagePublic 方法中,您可以这样做:

public class MessageScript : BaseScript<Message>
{
    public IEnumerable<Message> GetAllByLanguagePublic(string language)
    {
        return this.GetAll()
            .Include(x => x.User)
            .Include(x => x.MessageViews)
            .Where(x => x.Language == language).ToList();
    }
}

请注意,您需要包含 System.Data.Entity 才能将 Include 与 lambda 表达式一起使用。