Соединение Entity Framework с базой данных SQLite не работает после развертывания

Я изменил подход, основанный на наборе данных, для моей базы данных sqlite на подход, использующий Entity Framework. Я создал объекты с помощью мастера Visual Studio 2008, и строка подключения была сохранена в app.config. Затем клиентская программа связывается через WCF с базой данных. Это хорошо работает на компьютере разработчика, когда я размещаю службу WCF в консольном приложении. После размещения службы в IIS7 на удаленном компьютере я получаю сообщение об ошибке: "Основной поставщик не удалось открыть". Он генерируется при первой попытке операции чтения из базы данных.

Автоматически сгенерированная строка подключения:

     <add name="xPMDbEntities" connectionString="metadata=res://*/PM_EDM.csdl|
            res://*/PM_EDM.ssdl|
            res://*/PM_EDM.msl;
            provider=System.Data.SQLite;
            provider connection string=&quot;
            data source=G:\PMPersistence\xPMDb.s3db&quot;"          
            providerName="System.Data.EntityClient" />

(Я разбил строку на несколько строк, чтобы сделать ее более читаемой).

На сервере это не работает, даже если я размещаю базу данных в том же месте, что и на компьютере разработчика. Нужно ли редактировать что-либо из остальной части строки подключения (о которой я не понимаю в первую очередь)? Ссылка на хороший ресурс о том, как построить строки соединения EF, также будет очень полезна!

РЕДАКТИРОВАТЬ: я также добавил раздел ниже в файл web.config:

<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>

Кажется, это работает (Томас предполагает, что он должен находиться в файле machine.config), так как перед тем, как добавить эту запись, я получил сообщение о том, что System.Data.SQLite не может быть найден.

РЕДАКТИРОВАТЬ 2: Я установил dll System.Data.SQLite на сервере, а не просто скопировать dll в каталог BIN. Оба файла machine.config в папках Framework/Config и Framework64/Config теперь имеют вышеуказанную запись DbFactory. Это не имеет значения (если я не должен перезагрузить сервер??)

4 ответа

Решение

Строка подключения действительно была в порядке. Проблема заключалась в том, что вам нужно было развернуть и system.data.sqlite.dll, и system.data.sqlite.linq.dll в папку Bin веб-службы, в которой размещено соединение с базой данных.

Ваша строка подключения мне кажется правильной. Вы уверены, что поставщик SQLite ADO.NET правильно установлен на сервере? Откройте файл machine.config и проверьте, есть ли запись для System.Data.SQLite в разделе DbProviderFactories.

Ссылка на хороший ресурс о том, как построить строки соединения EF, также будет очень полезна!

В основном, вы должны указать: - метаданные модели (части с "res://...") - провайдер магазина (в вашем случае "System.Data.SQLite") - строка соединения с магазином, которая варьируется в зависимости от на каком провайдере вы используете

Самый простой способ динамически создать строку подключения - это использовать EntityConnectionStringBuilder класс, вместе со строителем строки подключения вашего поставщика магазина.

Я согласен с Томасом Строка выглядит хорошо для меня. Но если вы ищете информацию о построении строк соединения, проверьте это:

Попробуйте двойные косые черты для пути??

G:\\PMPersistence\\xPMDb.s3db

Также указание имени вашей сборки вместо * может помочь, когда приложение ищет ssdl,csdl,msl

res://YourAssemblyName(without the dll extn)/PM_EDM.ssdl|
Другие вопросы по тегам