c# – 使用EF Core在通用存储库中使用Reflection包含所有导航属
发布时间:2020-12-15 04:26:53 所属栏目:百科 来源:网络整理
导读:我正在为EF Core项目创建一个通用存储库,以避免为所有模型编写CRUD.我遇到的主要障碍是没有加载导航属性,因为Core还不支持延迟加载,而泛型类显然无法为类特定属性定义.Include语句. 我正在尝试为我的Get方法执行类似的操作以动态包含所有属性: public virtu
我正在为EF Core项目创建一个通用存储库,以避免为所有模型编写CRUD.我遇到的主要障碍是没有加载导航属性,因为Core还不支持延迟加载,而泛型类显然无法为类特定属性定义.Include语句.
我正在尝试为我的Get方法执行类似的操作以动态包含所有属性: public virtual T Get(Guid itemId,bool eager = false) { IQueryable<T> querySet = _context.Set<T>(); 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 How to get list of navigation properties for a domain object 是否有可能在EF Core中完成同样的事情? 解决方法
在EF Core中使用元数据比以前的EF版本更容易.
DbContext 级提供
Model 的物业,可供您使用
做你问的代码可能是这样的: public virtual IQueryable<T> Query(bool eager = false) { var query = _context.Set<T>().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加载嵌套导航属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |