在 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 表达式一起使用。
我有一个 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 表达式一起使用。