Я работаю над большим приложением ASP.NET, которое использует Entity Framework 6. Приложение состоит из большого количества библиотек DLL, некоторые из которых содержат файлы .edml
, соответствующие классы сущностей и некоторую дополнительную бизнес-логику для работы. с этими классами сущностей (включая чтение и запись из / в БД).
Это приложение отлично работает; никаких проблем с Entity Framework нет.
Теперь я пытаюсь добавить инструмент командной строки, который вызывает некоторые подпрограммы из вышеупомянутой бизнес-логики. Для этого я ссылаюсь на вышеупомянутые библиотеки DLL в моем проекте приложения командной строки.
Мне удалось получить доступ к базе данных, открыть соединение и выполнить рукописные команды SQL (с помощью CreateCommand
) из моего консольного приложения. К сожалению, любые вызовы с использованием Entity Framework до сих пор не выполнялись, что неизменно приводило к высказыванию ArgumentException
:
Не удалось определить версию хранилища; требуется действительное подключение к хранилищу или подсказка версии.
Полная трассировка стека (после оставления нашего собственного кода):
System.Data.Entity.Core.ProviderIncompatibleException: An error occurred accessing the database. This usually means that the connection to the database failed. Check that the connection string is correct and that the appropriate DbContext constructor is being used to specify it or find it in the application's config file. See http://go.microsoft.com/fwlink/?LinkId=386386 for information on DbContext and connections. See the inner exception for details of the failure.
---> System.Data.Entity.Core.ProviderIncompatibleException: The provider did not return a ProviderManifestToken string.
---> System.ArgumentException: Could not determine storage version; a valid storage connection or a version hint is required.
bei System.Data.Entity.SqlServer.SqlProviderServices.GetDbProviderManifestToken(DbConnection connection)
bei System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection)
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection)
bei System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection)
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection)
bei System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.<>c__DisplayClass1.<ResolveManifestToken>b__0(Tuple`3 k)
bei System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
bei System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.ResolveManifestToken(DbConnection connection)
bei System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest)
bei System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
Что здесь не так? Как заставить EF подключаться в моем приложении командной строки так же безупречно, как при запуске из IIS? Как узнать, в чем разница в конфигурации?
Я нашел различные связанные вопросы и ресурсы, ни один из которых не оказался полезным:
- Не удалось определить ошибку версии хранилища, сначала код EF 6 : Честно говоря, я не уверен, какую строку подключения EF пытается использовать. Объект, указанный моим
DbContext
объектом (расширенная оболочка для класса DbContext
EF), является правильным и используется для «ручного» доступа. Возможно , он не используется EF, но я не уверен, где искать. (Может быть, знание об этом ответит на вопрос.)
- Как исправить «Не удалось определить версию хранилища; требуется действительное соединение с хранилищем или указание версии »: Причиной этой ошибки является переключение версий EF. Это не относится к моему делу, учитывая, что мы все время использовали EF6 и ничего больше.
- Переход от Entity Framework 5 к Entity Framework 6 и обратно или «Не удалось определить версию хранилища» : еще раз, это относится к изменению версии EF, которое не произошло в моем случае. (Кроме того, упомянутая таблица
__MigrationHistory
, по-видимому, не существует в рассматриваемой БД.)
- Не удалось определить версию хранилища; требуется действительное подключение к хранилищу или подсказка версии : первый описанный случай звучит поверхностно, но на этот вопрос нет ответов.
- Не удалось определить версию хранилища - Entity Framework : на этот вопрос есть несколько ответов, которые заслуживают отдельного комментария:
- Ответ Sithu : В нашем приложении нет файлов
.edmx
. Из того, что я читаю, похоже, что они появляются только с подходом, основанным на коде, в то время как мы, похоже, используем подход, основанный на базе данных. Что бы это ни стоило, в моем проекте приложения командной строки вообще нет файлов, специфичных для EF, потому что все, что специфично для EF, должно храниться в различных DLL-файлах с частичными моделями сущностей.
- Ответ Ровджюрета : Я уже ссылаюсь на единственную версию EF (6. *), для которой библиотеки доступны в наших каталогах проектов.
- Ответ Гэри Буна : Как упоминалось ранее, миграции не выполняются, и эта таблица здесь не существует.
- Ответ Тиру : По общему признанию, я еще не пробовал это из-за нехватки информации, что это должно измениться.Мне не нравится случайное выбрасывание пакетов или инструментов в систему, пока мой код не сработает из-за неясного побочного эффекта.В конце концов, мой код также должен работать на производственных машинах, и мне нужно точно знать, какие пакеты следует развернуть вместе с ним.
- F.Ответ Машожеры : Это ничего не меняет, но мой конфигурационный файл не имеет раздела
<entityFramework>
, поэтому я не уверен, что хорошая регистрация класса десериализации для него в элементе <configSections>
можетвозможно вообще.