2013-01-11 31 views
8

我创建一个委托来检索数据库中的所有专辑记录。我在另一个项目中使用了相同的方式,但由于某种原因,我这次得到一个错误。编译查询不隐式引用转换到ObjectContext

我错过了一步吗?我不确定为什么会出现此错误。

代码

 public static readonly Func<CodySolutionEntities, IQueryable<Album>> SelectAlbums = 
     CompiledQuery.Compile<CodySolutionEntities, IQueryable<Album>>(
      query => from q in query.Albums.Include("Photo") 
        select q); 

错误

错误1类型 'CodyData.Diagram.CodySolutionEntities' 不能被用作类型parameter 'TArg0' in the generic type or method 'System.Data.Objects.CompiledQuery.Compile<TArg0,TResult>(System.Linq.Expressions.Expression<System.Func<TArg0,TResult>>)'. There is no implicit reference conversion from 'CodyData.Diagram.CodySolutionEntities' to 'System.Data.Objects.ObjectContext'. C:\Users\Cody\Documents\CMBS\CodySolution\CodyData\Delegates\PhotoDelegates.cs 13 13 CodyData

回答

16

该错误消息表示CodySolutionEntities不衍生自ObjectContext,这是一个问题,因为CompiledQuery只有工作ks与ObjectContext。在这种情况下,CodySolutionEntities必须来自DbContext对象,此时该对象为the recommended context object to use

CompiledQuery可能在过去工作,因为实体框架4.1之前的版本创建了一个从ObjectContext而不是DbContext派生的对象,供您管理您的实体。

this类似,如果您能够以.NET 5为目标,则可以使用EF 5,并且不再需要CompiledQuery,因为它会自动为您编译已编译的LINQ to Entity查询。如果不是的话,你可能会考虑切换回使用ObjectContext,但在做之前请确保你的心态不仅仅是compiled or bust

+0

什么是使用'DbContext'来做我想做的事情的等价方法呢? – Cody

+1

这就是问题所在,你**不能**在'CompiledQuery'中使用'DbContext'。请参阅:http://stackoverflow.com/a/6731102/1289454。你可以坚持一个没有编译的查询吗? (var context = new CodySolutionEntities()){var albums = context.Albums.Include(a => a.Photos); // ...} – gowansg