我开始在自己的运动数据库中使用存储库模式,直到现在,使用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等对我来说仍然具有魔力。我无法为此提供解决方案。