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

我正在为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的物业,可供您使用

The Metadata about the shape of entities,the relationships between them,and how they map to the database.

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

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加载嵌套导航属性.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...