我已经关闭了 DbContext 上的延迟加载和代理创建。我正在使用 Repository partern 和 UnitOfWork。我的 UnitOfWork 继承自 DBConext。这是我正在做的一个例子:
public class User
{
public Guid Id {get;set;}
public virtual Guid UserTypeId {get;set;} //foreign key to UserType and setup in the EF fluent mappings and it does load if I am using lazy loading.
public virtual UserType {get;set;}
}
public class UserType
{
public Guid Id {get;set;}
public string Name {get;set;}
}
这是在我的 UoW 中:
public IDbSet<TEntity> CreateSet<TEntity>() where TEntity : class
{
return base.Set<TEntity>();
}
我通过我的存储库查询上下文:
protected Expression<Func<TEntity, object>>[] Includes;
public IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> criteria, params Expression<Func<TEntity, object>>[] includes)
{
Includes = includes;
return GetSet().Where(criteria)
.AsEnumerable();
}
public IDbSet<TEntity> GetSet()
{
var set = _unitOfWork.CreateSet<TEntity>();
if(Includes != null)
{
foreach (var include in Includes)
{
set.Include(include);
}
}
return set;
}
因此,如您所见,我传入了要包含在查询中的表达式数组。所以我可以这样称呼它:
var users = userRespository.Get(u => u.Id == SomeGuid, u => u.UserType);
UserType 未包含在查询中,我不知道是什么。我应该在 DbContext 上调用 Set 以外的东西吗?
更新 :
在我调用 base.Set 之前,我在想我需要在那里添加包含。虽然不确定。
最佳答案
IQueryable
上的所有扩展方法通常以他们生产新的方式工作 IQueryable
所以如果你想获得效果,你必须分配它:
public IDbSet<TEntity> GetSet()
{
var set = _unitOfWork.CreateSet<TEntity>();
if(Includes != null)
{
foreach (var include in Includes)
{
set = set.Include(include);
}
}
return set;
}
顺便提一句。它看起来很像 my older solution .
关于entity-framework - 调用 DbContext.Set<T>().Include() 不是查询包含的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9840033/