Соединение 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="
data source=G:\PMPersistence\xPMDb.s3db""
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|