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

时间:2016-10-13 09:16:30

标签: c# .net entity-framework eager-loading

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

在DbContext中,禁用了LazyLodingEnabled(false)。

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

BaseScript

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

MessageScript

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

1 个答案:

答案 0 :(得分:1)

我想你的问题是“为什么UserMessageViews没有加载?”如果是这样的话,那你就是在回答自己。如果禁用延迟加载,则必须使用Include显式加载这些属性(例如):

也许在您的BaseScript.GetAll中,您想要返回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表达式。