【问题标题】:Loading related entities in BaseScript (DbContext)在 BaseScript (DbContext) 中加载相关实体
【发布时间】:2016-10-13 09:16:29
【问题描述】:

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

在 DbContext 中禁用了 LazyLodingEnabled (false)。

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

基础脚本

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

【问题讨论】:

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


    【解决方案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 表达式一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      相关资源
      最近更新 更多