Entity Framework: "Основной провайдер отказался от Open"
Когда я пытаюсь вставить запись, я получаю эту ошибку: базовый провайдер отказался от Open.
Эта ошибка возникает только с IIS, а не с веб-сервером VWD 2008.
В EventViewer я получаю эту ошибку приложения: Не удалось создать экземпляр пользователя SQL Server из-за сбоя в запуске процесса для экземпляра пользователя. Соединение будет закрыто. [КЛИЕНТ:]
<add name="ASPNETDBEntities"
connectionString="
metadata=res://*/Models.FriendList.csdl|res://*/Models.FriendList.ssdl|res://*/Models.FriendList.msl;
provider=System.Data.SqlClient;
provider connection string="
Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;
Integrated Security=True;
Connect Timeout=30;
User Instance=True;
MultipleActiveResultSets=True""
providerName="System.Data.EntityClient" />
Я использую файл aspnetdb.mdf, а не внешнюю базу данных.
Я искал достаточно для этого, но не использовал.
Все отлично работает с веб-сервером VWD
Ответы
Ответ 1
Вы должны создать учетную запись sql для своего веб-сервера для доступа к базе данных aspnetdb. В настоящее время он использует встроенную проверку подлинности (пытается войти в систему с идентификатором, который веб-сервер использует для запуска приложения).
В приведенном ниже примере используется встроенный auth. Я бы использовал SQL auth, хотя.
http://msdn.microsoft.com/en-us/library/ff649314.aspx
Ответ 2
У меня была такая же проблема, и после выполнения отладки я увидел, что создаю новый экземпляр DB Entity для каждого действия и создавая новый экземпляр Db Entity, который открывает новое соединение с db.
Ниже приведен код:
Private tmpConnection As New DbModel.DbEntities
поэтому, снова вызывая переменную, создавая новый экземпляр DbEntites и открывая новое соединение с db.
поэтому я пишу для этого небольшую функцию, и это решило мою проблему. Теперь больше нет ошибок.
Private tmpConnection As DbModel.DbEntities
Public Function dbCon() As DbModel.DbEntities
If tmpConnection IsNot Nothing Then
If tmpConnection.Connection.State = ConnectionState.Closed Then
Try
tmpConnection.Connection.Open()
Return tmpConnection
Catch ex As Exception
My.Response.Redirect("dberror.aspx")
End Try
Else
Return tmpConnection
End If
Else
tmpConnection = New DbModel.DbEntities
Try
tmpConnection.Connection.Open()
Return tmpConnection
Catch ex As Exception
My.Response.Redirect("dberror.aspx")
End Try
End If
Return Nothing
End Function
и, наконец, в вашей строке соединения добавьте "Время ожидания подключения = 30;"
thats работает так идеально для меня
Ответ 3
Использование нового экземпляра DB Entity для каждого действия не должно физически создавать соединение с вашим SQL-сервером. Entity Framework будет использовать пул соединений, созданный для вашего (процесс, домен приложения, строку подключения), как он настроен в вашей строке подключения, чтобы избежать создания новых подключений.
Эта проблема - очень экологичные и настраиваемые параметры (в вашей строке подключения), как показано ниже, должны решить проблему -
Минимальный размер пула = 1;
Максимальный размер пула = 100;//default
Время ожидания подключения = 15;//в секундах
Аккумулирование = истина;
Ответ 4
В моем случае я использовал Sql CE, и моя строка соединения была настроена с абсолютным путем, а не inf | DataDirectory | переменная. Изменил это, и он начал работать на сервере.
Очевидно, что он отлично работал на машине разработки.
Ответ 5
Добавьте атрибут ниже в строку Connection, которую вы указали.
<add
name="ASPNETDBEntities"
connectionString="metadata=res://*/Models.FriendList.csdl|
res://*Models.FriendList.ssdl|res://*/Models.FriendList.msl;
provider=System.Data.SqlClient;provider connection string="
Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;
Integrated Security=True;Connect Timeout=30;
User Instance=True;
MultipleActiveResultSets=True""
ProviderName="System.Data.EntityClient"
User Instance="False"/>
Ответ 6
Может быть, слишком поздно, чтобы ответить, но у меня была такая же проблема.
Я добавил тайм-аут области (5 минут). Я привел пример.
Dim varIntervalo As New TimeSpan(0, 5, 0)
Using varTransaccion As New TransactionScope(TransactionScopeOption.Required, varIntervalo)
For vari As Integer = 2 To varMatrizDatos.GetUpperBound(0)
Dim varWhateverAs New TABLE
varWhatever.ID_TABLE = something
varWhatever.DESC_TABLE = something else
varWhatever.DATE_TABLE = CDate(Now.Date)
varEntidades.AddToTABLESet(varWhatever)
varEntidades.SaveChanges()
Next
varTransaccion.Complete()
End Using
Возможно, этот код может быть улучшен.
Ответ 7
Кроме того, это исключение вызывается, когда таблица, которую вы собираетесь манипулировать, удаляется или не существует
Ответ 8
Это исключение, похоже, бросается, когда есть что-то, что может привести к недопустимости вашей строки подключения. Недопустимые учетные данные были причиной для меня.
Ответ 9
У меня была аналогичная проблема, и я также использую IIS. Я открыл окно команд и набрал iisreset
. Проблема решена.
Ответ 10
Эта проблема возникает, когда база данных добавлена в ServerExplorer в качестве проверки подлинности Windows. Когда вы используете аутентификацию sql во время добавления базы данных в ServerExplorer, проблема устраняется. Если вы все еще используете проверку подлинности Windows и избегаете этого исключения, укажите идентификатор пользователя и пароль базы данных в строке подключения в файле webconfig.
Эта проблема возникает только при размещении службы в IIS