如何使用存储库在entityframework中包含对象?

时间:2013-04-13 14:22:52

标签: c#-4.0 entity-framework-5 lazy-loading repository-pattern

我使用函数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; }

1 个答案:

答案 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);