Скомпилированный запрос без неявного преобразования ссылок в 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


person Cody    schedule 11.01.2013    source источник


Ответы (1)


Сообщение об ошибке указывает, что CodySolutionEntities не является производным от ObjectContext, что является проблемой, поскольку CompiledQuery работает только с ObjectContext. В этом случае CodySolutionEntities должен быть получен из объекта DbContext, который в настоящее время является рекомендуемым объектом контекста для использования. .

CompiledQuery, вероятно, работал в прошлом, потому что версии Entity Framework до 4.1 создавали объект, производный от ObjectContext вместо DbContext, чтобы вы могли управлять своими сущностями.

Как объясняется в в этом сообщении, если вы можете ориентироваться на .NET 4.5, вы можно использовать EF 5, и вам больше не понадобится CompiledQuery, так как он автоматически кэширует скомпилированные запросы LINQ to Entity. Если нет, вы можете вернуться к использованию ObjectContext, но перед этим убедитесь, что ваше мышление не просто собран или уничтожен.

person gowansg    schedule 12.01.2013
comment
Тогда каким будет эквивалентный способ использования DbContext для того, что я пытаюсь сделать? - person Cody; 12.01.2013
comment
В том-то и проблема, что вы не можете использовать DbContext с CompiledQuery. См.: stackoverflow.com/a/6731102/1289454. Не могли бы вы просто придерживаться запроса, который не скомпилирован? using(var context = new CodySolutionEntities()){ var albums = context.Albums.Include(a => a.Photos); //... } - person gowansg; 12.01.2013
comment
Чтобы ответить на ваш вопрос, эквивалентно: public static только для чтения Func‹CodySolutionEntities, IQueryable‹Album›› SelectAlbums = query =› from q в query.Albums.Include(Photo) select q; Но я понятия не имею, будет ли это более эффективным, чем использование встроенного. - person Tod; 18.10.2018