我使用函数bellow从存储库中获取“粘贴”,但我无法访问在获取粘贴时应包含的对象。 (Paste.FilterGroup.Ads)。
我的存储库功能:
public T Find<T>(Expression<Func<T, bool>> predicate) where T : class
{
return Context.Set<T>().FirstOrDefault<T>(predicate);
}
在我的代码中我试试这个。
oPaste = _repository.Find<Paste>(x => x.PasteID == oPaste.PasteID);
if (oPaste.FilterGroup != null)
{
_log.Debug("FilterGroup: " + oPaste.FilterGroup.Name);
if (oPaste.FilterGroup.Ads != null && oPaste.FilterGroup.Ads.Count() > 0)
{
_log.Debug("FINALLY");
}
else
{
_log.Debug("Paste " + oPaste.PasteID + " has no ads");
}
}
else
{
_log.Debug("Paste " + oPaste.PasteID + " has no filtergroup");
}
修改 粘贴类包含
public virtual FilterGroup FilterGroup { get; set; }
FilterGroup类包含
public virtual IEnumerable<Ad> Ads { get; set; }
答案 0 :(得分:0)
您必须替换
public virtual IEnumerable<Ad> Ads { get; set; }
通过
public virtual ICollection<Ad> Ads { get; set; }
或其他一些实现ICollection<T>
的集合类型。 IEnumerable<T>
没有,EF会将其忽略为导航属性。
只要您的上下文处于活动状态,就应该通过延迟加载来加载导航属性。
您还可以支持存储库中的预先加载:
using System.Data.Entity; // required for the lambda version of Include
// ...
public T Find<T>(Expression<Func<T, bool>> predicate,
params Expression<Func<T, object>>[] includes) where T : class
{
IQueryable<T> query = Context.Set<T>();
if (includes != null)
foreach (var include in includes)
query = query.Include(include);
return query.FirstOrDefault<T>(predicate);
}
然后这样称呼它:
oPaste = _repository.Find<Paste>(x => x.PasteID == oPaste.PasteID,
x => x.FilterGroup.Ads);