Соединение Entity Framework с базой данных SQLite не работает после развертывания - PullRequest
5 голосов
/ 08 февраля 2010

Я изменил подход, основанный на наборе данных, для моей базы данных 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 не найден.

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

Ответы [ 4 ]

6 голосов
/ 09 февраля 2010

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

4 голосов
/ 08 февраля 2010

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

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

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

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

1 голос
/ 08 февраля 2010

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

0 голосов
/ 08 февраля 2010

пробовать двойную косую черту для пути ??

G:\\PMPersistence\\xPMDb.s3db

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

res://YourAssemblyName(without the dll extn)/PM_EDM.ssdl|
...