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=&quot;
         Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;
         Integrated Security=True;
         Connect Timeout=30;
         User Instance=True;
         MultipleActiveResultSets=True&quot;"
     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=&quot;
                       Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ASPNETDB.MDF;
                       Integrated Security=True;Connect Timeout=30;
                       User Instance=True;
                       MultipleActiveResultSets=True&quot;" 
     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