Csharp/C#教程:使用EF Core在通用存储库中使用Reflection包含所有导航属性分享


使用EF Core在通用存储库中使用Reflection包含所有导航属性

我正在为EF Core项目创建一个通用存储库,以避免为所有模型编写CRUD。 我遇到的主要障碍是没有加载导航属性,因为Core还不支持延迟加载,而generics类显然无法为类特定属性定义.Include语句。

我正在尝试为我的Get方法执行类似的操作以动态包含所有属性:

public virtual T Get(Guid itemId, bool eager = false) { IQueryable querySet = _context.Set(); if (eager) { foreach (PropertyInfo p in typeof(T).GetProperties()) { querySet = querySet.Include(p.Name); } } return querySet.SingleOrDefault(i => i.EntityId == itemId); } 

但是,当包含不是导航属性的属性时,它会引发错误。

我发现这个答案与EF 5相同,但它涉及EF核心中不存在的方法:

EF5如何获取域对象的导航属性列表

是否有可能在EF Core中完成同样的事情?

在EF Core中使用元数据比以前的EF版本更容易。 DbContext类提供了可以访问的Model属性

有关实体形状,它们之间的关系以及它们如何映射到数据库的元数据。

做你问的代码可能是这样的:

 public virtual IQueryable Query(bool eager = false) { var query = _context.Set().AsQueryable(); if (eager) { foreach (var property in _context.Model.FindEntityType(typeof(T)).GetNavigations()) query = query.Include(property.Name); } return query; } public virtual T Get(Guid itemId, bool eager = false) { return Query(eager).SingleOrDefault(i => i.EntityId == itemId); } 

请注意,虽然这符合您的要求,但它是非常有限的通用方法,因为它只加载实体的直接导航属性,即不处理使用ThenInclude加载嵌套导航属性。

上述就是C#学习教程:使用EF Core在通用存储库中使用Reflection包含所有导航属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1030724.html

(0)
上一篇 2022年1月13日
下一篇 2022年1月13日

精彩推荐