我添加了以下扩展方法
/// <summary>
/// Provides a statically typed interface for db includes
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="set">The set.</param>
/// <param name="includes">The includes.</param>
/// <returns>DbSet<T>.</returns>
public static DbSet<T> Include<T>(this DbSet<T> set, params Expression<Func<T, object>>[] includes) where T : class
{
if (includes != null)
{
foreach (var expression in includes)
{
set.Include(expression);
}
}
return set;
}
这是基于我在这里找到的存储库代码
https://github.com/carbonrobot/FullStackEF/tree/master/src
但是,当我使用以下
时 public ServiceResponse<Town> Get(int id)
{
Func<Patient> func = delegate
{
using (var context = _contextFactory())
{
return context.Get<Town>(id, x => x.County);
}
};
return this.Execute(func);
}
城镇类包含县实体。
我得到一个无限循环,因为它调用扩展方法而不是base include? p>
我在这里做错了什么想法?
答案 0 :(得分:1)
这种方法有几个错误。
DbExtensions.Include
方法具有以下签名:
public static IQueryable<T> Include<T, TProperty>(
this IQueryable<T> source,
Expression<Func<T, TProperty>> path
)
where T : class
正如您所看到的,它接收IQueryable<T>
并返回另一个IQueryable<T>
,必须将其分配给变量并返回而不是原始的,以便生效,而代码没有这样做。
此外,由于该方法在类型Include
的{{1}}变量上调用set
,该变量比DbSet<T>
更具体,并且参数与自定义的签名匹配方法,编译器只调用相同的方法,因此IQueryable<T>
。
话虽如此,这是正确的自定义方法签名和实现:
StackOverflowException