Entity Framework + развертывание SQLite

asp.net-mvc entity-framework sqlite system.data.sqlite

Вопрос

У меня есть приложение 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()

Если вы это сделаете, вы используете простой вызов библиотеки для создания соединения, и нет выбора времени выполнения провайдера БД. Это может быть менее гибким, поскольку вы больше не можете обмениваться поставщиками данных через файл конфигурации, но для многих библиотек этого достаточно. К сожалению, если вы не контролируете библиотечный код, это не вариант.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow