Служба Windows, ссылающаяся на Entity Framework 6, перестает работать при развертывании
У меня есть консольное приложение.Net 4.5.1, настроенное как служба Windows (происходит от ServiceBase) с использованием EntityFramework 6.1, установленной через пакет Nuget.
Он отлично работает локально (где я запускаю его как консольное приложение).
Я развернул его на компьютере с Windows Server 2008, на котором установлена .Net 4.5.2, зарегистрировал его в качестве службы Windows и успешно запустил службу.
У сервиса есть таймер, который работает каждые 90 секунд. Первый раз, когда он работает (после 90 секунд), когда он пытается читать из базы данных SQL Server, происходит сбой с этим сообщением об ошибке:
System.Configuration.ConfigurationErrorsException: The 'DbProviderFactories' section can only appear once per config file.
Я просмотрел 2 файла machine.config на машине (в папках.Net 2 и 4) и убедился, что у каждого из них только один раздел DbProviderFactories. В моем сервисе app.config нет DbProviderFactories. EventViewer не имеет никакой информации. Я переустановил.Net 4.5.2 и перезапустил сервер безрезультатно.
Как я могу узнать, где он пытается загрузить два раздела DbProviderFactories?
Я добавляю следующую информацию на всякий случай.
Во второй раз, когда служба работает (после 180 секунд), когда она пытается прочитать из той же базы данных SQL Server, происходит сбой с другим сообщением об ошибке:
The ADO.NET provider with invariant name 'System.Data.SqlClient' is either not registered in the machine or application config file, or could not be loaded.
Это второе сообщение об ошибке похоже на эту проблему: не найден поставщик Entity Framework для поставщика ADO.NET с инвариантным именем "System.Data.SqlClient", но, к сожалению, я уже реализовал все предложения, чтобы это исправить.
Я установил Entity Framework 6 из пакета Nuget как в своем слое доступа к данным, так и в моей службе Windows Console App. Установщик NuGet вставил необходимые разделы в мой app.config:
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
а также
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
Я развернул то, что Visual Studio помещает в папку bin при сборке. Развертывание включает в себя как EntityFramework.dll, так и EntityFramework.SqlServer.dll
Моя строка подключения к базе данных:
<connectionString value="data source=SQLServerName;initial catalog=DatabaseName;integrated security=true;persist security info=True" />
Служба Windows работает под учетной записью, которая имеет доступ к базе данных.
Эта вторая ошибка продолжается, пока я не отключил службу.
1 ответ
Оказалось, что это был ответ: раздел "DbProviderFactories" может появляться только один раз для каждого файла конфигурации.
Когда я заявил: "Я посмотрел 2 файла machine.config на машине (в папках.Net 2 и 4) и убедился, что у каждого из них только один раздел DbProviderFactories". это было ложно. Был дубликат, я просто не видел его с первого взгляда.