从<T>实体框架核心 3.1 中的 IQueryable 访问外键属性



我正在编写一个IQueryable<T>扩展方法,我想获得T导航属性的外键。我已经发现我可以通过IModel.FindEntityType(T).GetNavigations()访问它们,问题是如何最好地访问IModel,同时保持方法尽可能简单。

目前的方法看起来像这样:

public static IQueryable<TQuery> DoMagic<TQuery>(this IQueryable<TQuery> query, IModel model)
{
var entity = model.FindEntityType(entityType);
var navigationProperties = entity.GetNavigations();
...
}

如果我不需要通过IModel作为这样的论点,我会很高兴:

public static IQueryable<TQuery> DoMagic<TQuery>(this IQueryable<TQuery> query)
{
var entity = Model.FindEntityType(entityType);
var navigationProperties = entity.GetNavigations();
...
}

我已经考虑添加一个IServiceCollection扩展方法,并传递DbContext,并将IModel设置为IQueryable<T>扩展方法的静态属性。问题是它将我限制在一个DbContext

我还研究了向DbContextOptionsBuilder添加扩展方法的选项,但还没有真正找到实现我想要的方法的最佳方法。

也许还有其他方法可以访问外键?非常感谢您的帮助!

编辑

从导航属性中,我想访问ForeignKey-属性,以了解用于解析导航属性的属性。类似于:

navigationProperties.ToList().Select(x => x.ForeignKey);

获取导航属性的一种方法:

public static IQueryable<TQuery> DoMagic<TQuery>(this IQueryable<TQuery> query)
{
var navigationProperties = typeof(TQuery).GetProperties()
.Where(p => (typeof(IEnumerable).IsAssignableFrom(p.PropertyType) && p.PropertyType != typeof(string)))
.ToArray();
...
}

更新:尝试从IQueryable中获取具有Model属性的DbContext会导致一些不漂亮的代码,此链接显示了如何做到这一点:

Net EF Core 2.1从IQueryable参数获取DbContext

如果使用依赖项注入,可以将DbContext的实例放入web请求或操作范围内的容器中,并使用DoMagic方法将其注入类中。

另一种方法可以将该方法添加到DbContext类的子代,这样就不需要模型参数。

最新更新