0

我使用以下功能从存储库中获取“粘贴”,但我无法访问在获取粘贴时应包含的对象。(粘贴.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; }
4

1 回答 1

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);
于 2013-04-14T12:05:59.443 回答