在存储库模式的Get方法中添加Include选项

时间:2018-06-30 11:08:29

标签: c# .net entity-framework entity-framework-6

我开始在自己的运动数据库中使用存储库模式,直到现在,使用Get方法的实现一切都很好:

public T Get(int id)
{
    return _context.Set<T>().Find(id);
}

此方法仅返回给定ID的对象。当返回的对象包含一些导航属性时出现问题-使用我的Get,它们总是为null。我使用http://www.janholinka.net/Blog/Article/9修改了Get Get a little:

public T Get(int id, params Expression<Func<T, object>>[] includes)
{
    IQueryable<T> query = _context.Set<T>();
    if (includes != null)
        foreach (Expression<Func<T, object>> include in includes)
            query = query.Include(include);

    return ((DbSet<T>)query).Find(id);
}

现在我有一个包含表达式的数组作为附加参数,因此,我应该能够使用这种方法(例如):

var data = myRepository.Get(1, n => n.MyProperty1);

不幸的是,我在方法的最后一行遇到了异常:

'Unable to cast object of type 'System.Data.Entity.Infrastructure.DbQuery`1[MjIot.Storage.Models.EF6Db.Device]' to type 'System.Data.Entity.DbSet`1[MjIot.Storage.Models.EF6Db.Device]'.'

它不能将DbQuery强制转换为DbSet。我尝试了许多不同的类型转换,因为我的方法甚至还没有为我编译。因此我的方法与 janholinka 网站上提供的方法有所不同。

实体框架的DbSet,DbQueries等对我来说仍然具有魔力。我无法为此提供解决方案。

0 个答案:

没有答案