Entity Framework + развертывание SQLite - PullRequest
6 голосов
/ 16 февраля 2009

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

Ура, -pom-

Ответы [ 3 ]

13 голосов
/ 11 июля 2009

Вы вряд ли будете больше это читать, но в вашем 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()

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

0 голосов
/ 15 августа 2010

SQLite требуется разрешение полного доверия для развертывания приложений ASP.NET. Многие провайдеры виртуального хостинга этого не допускают. Возможно, вы не захотите это проверять.

0 голосов
/ 16 февраля 2009

Вы пытались добавить необходимые библиотеки DLL в каталог bin вашего приложения? Возможно, вы захотите взглянуть на статью Фила Хаака о Bin Deployying ASP.NET MVC , чтобы узнать, как сделать это автоматически.

...