Val*_*tor 8 c# system.reflection entity-framework-core
我正在为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);
}
Run Code Online (Sandbox Code Playgroud)
但是,当包含不是导航属性的属性时,它会引发错误.
我发现这个答案与EF 5相同,但它涉及EF核心中不存在的方法:
是否有可能在EF Core中完成同样的事情?
Iva*_*oev 16
在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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,虽然这符合您的要求,但它是非常有限的通用方法,因为它只加载实体的直接导航属性,即不处理加载嵌套导航属性ThenInclude.
| 归档时间: |
|
| 查看次数: |
4031 次 |
| 最近记录: |