У меня есть приложение ASP.NET MVC, которое использует базу данных SQLite через Entity Framework. Все работает на локальном веб-сервере разработки VS 2008.
Тем не менее, развертывание веб-приложения для моего поставщика услуг вызывает эту ошибку:
[ArgumentException: Unable to find the requested .Net Framework Data Provider. It may not be installed.]
System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +1308959
System.Data.EntityClient.EntityConnection.GetFactory(String providerString) +35
Поставщик услуг отметил, что они не поддерживают SQLite. Я думал, что SQLite не зависит от настроек поставщика услуг, так как он может быть развернут App_Data.
Кто-нибудь сталкивался с успешным развертыванием Entity Framework + SQLite?
Ура -пом-
Вы вряд ли будете больше это читать, но вам не хватает следующего в вашем app.config (или, для вас, web.config):
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite"
description=".Net Framework Data Provider for SQLite"
type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
</configuration>
В частности, если вы используете sqlite в библиотеке, которая связана с вашим сайтом, вы должны добавить это в файл конфигурации сайта, а не в библиотеку! Это происходит из-за того, как вы загружаете провайдера: по сути, вы определяете во время выполнения, какую dll загружать, используя строку «System.Data.SQLite», и поиск соответствующего провайдера выполняется с использованием настроек сборки записи ,
Изменить: Кстати, когда вы пишете библиотеку, которая имеет зависимость sqlite, вы можете избежать этой сложности. Вам не нужно использовать DbProviderFactories
для поиска sqlite во время выполнения; вы также можете взять зависимость от времени компиляции, которой легче управлять. Затем вы можете игнорировать приведенный выше раздел app.config и заменить все экземпляры:
DbProviderFactories.GetFactory("System.Data.SQLite").CreateConnection()
с
System.Data.SQLite.SQLiteFactory.Instance.CreateConnection()
Если вы это сделаете, вы используете простой вызов библиотеки для создания соединения, и нет выбора времени выполнения провайдера БД. Это может быть менее гибким, поскольку вы больше не можете обмениваться поставщиками данных через файл конфигурации, но для многих библиотек этого достаточно. К сожалению, если вы не контролируете библиотечный код, это не вариант.