Entity Framework Code Сначала игнорируется строка подключения, вместо этого используется IIS

У меня есть веб-приложение, которое я создал с помощью Entity Framework Code First. При его настройке мне удалось сопоставить мою строку подключения к БД с моим DBContext, указав полное пространство имен и класс DBContext в качестве имени строки подключения.

<add name="MyClassProject.EfDbContext"  connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MyDatabase;Integrated Security=true;User Id=MyUsername;Password=MyPassword;" providerName="System.Data.SqlClient"/>

Первоначально, когда я настраивал проект, я просто создал его в c:\inetpub\wwwroot и просто запустил через Visual Studio. Все работало нормально.

Теперь я пытаюсь создать код в отдельной папке веб-сайта и запустить веб-сайт как собственный веб-сайт и пул приложений в IIS. Я настроил веб-сайт и файл hosts, но когда я запустил его, я получил следующую ошибку.

Не удается открыть базу данных MyDatabase, запрошенную при входе в систему. Вход не выполнен.

Ошибка входа для пользователя «IIS APPPOOL\MyAppPool».

Мне интересно, почему это происходит, поскольку я, кажется, указываю имя пользователя и пароль безопасности для использования для БД в моей строке подключения .... так почему он пытается подключиться как пул приложений, в котором работает мой веб-сайт? ?

Кроме того, как я могу это исправить, не предоставляя MyAppPool (или сетевой службе, если я изменил ее на это) разрешения БД в SQL Server?

Обновление: я должен был упомянуть, что я инициализирую свой класс DBContext, используя:

namespace MyClassProject 
{ 
    public class EfDbContext : DbContext 
    { 
        public EfDbContext() : base ("MyDatabase") 
        {
        }
    }
}

person Sean Holmesby    schedule 04.03.2013    source источник


Ответы (4)


Я нашел проблему. Когда я инициализирую свой класс DBContext с помощью : base("MyDatabase"), он переопределяет строку подключения, указанную в файле web.config.

Удалив это из моего класса DBContext с уже существующей базой данных, сайт теперь работает в IIS. Однако, если у меня еще не создана база данных (или если мой инициализатор базы данных использует DropCreateDatabaseWhenModelChanges или DropCreateDatabaseAlways, так что ему нужно будет воссоздать БД), инициализатор потерпит неудачу, поскольку он попытается использовать Пользователь SQL, у которого нет прав на создание БД.

Мой способ обойти это - использовать : base("MyDatabase") и изначально запускать из Visual Studio, чтобы база данных была создана. Затем удалите его из кода, добавьте указанного пользователя в систему безопасности БД в SQL Server, и после этого мой сайт сможет работать в IIS.

person Sean Holmesby    schedule 05.03.2013
comment
base("MyDatabase") означает имя строки подключения из Web.config. Поэтому вам просто нужно иметь разные строки подключения для разных точек развертывания. Или установите другое имя в зависимости от условия. - person abatishchev; 05.03.2013

Удалить Integrated Security=true;. Это параметр, который пропускает текущего пользователя.

person Daniel A. White    schedule 04.03.2013
comment
Я удалил этот атрибут из строки подключения, но проблема осталась. Я даже пытался явно установить Integrated Security=false; но это тоже не сработало. - person Sean Holmesby; 05.03.2013
comment
@SeanHolmesby, вы уверены, что используете эту строку подключения? - person Daniel A. White; 05.03.2013
comment
Когда я запускаю Visual Studio (когда он работает), он определенно добавляет данные в базу данных, на которую я пытаюсь ссылаться. У меня есть: - namespace MyClassProject { public class EfDbContext : DbContext { public EfDbContext() : base (MyDatabase) { } } } ...... И затем...... ‹connectionStrings› ‹add name=MyClassProject.EfDbContext connectionString=идентификатор пользователя=MyUsername;пароль=MyPassword;источник данных=.\SQLEXPRESS;база данных=MyDatabase;встроенная безопасность=false; providerName=System.Data.SqlClient/› ‹/connectionStrings› - person Sean Holmesby; 05.03.2013
comment
Мои исходные данные используют CreateDatabaseIfNotExists... однако БД уже существует, когда я запускал Visual Studio. Затем я вошел, добавил пользователя в систему безопасности для БД и попытался запустить через IIS. - person Sean Holmesby; 05.03.2013

При использовании встроенной безопасности БД предоставляется токен от пользователя, который в данный момент запускает процесс. По всей вероятности, вы запускаете Visual Studio из своей учетной записи пользователя, которая, вероятно, имеет права администратора на вашем экземпляре SQL Server.

Когда IIS запускает ваше приложение, он использует нечто, называемое пулом приложений (или пулом приложений). Вы можете иметь несколько приложений в одном пуле для совместного управления. Пул приложений также работает под специальной учетной записью пользователя, названной в честь пула. Пользователи пула приложений существуют в контейнере под названием «IIS AppPool», поэтому локальным пользователем для DefaultAppPool является IIS AppPool\DefaultAppPool. Если вы хотите предоставить доступ к ресурсу в вашей локальной системе (включая права доступа к файлам), вы также можете предоставить его пользователю пула приложений или локальной группе IIS_IUSRS, чтобы предоставить его всем пулам приложений.

Помните, что это локальные учетные записи, поэтому они не будут пересекать границы сети. Чтобы предоставить разрешения на другом сервере, вам нужно либо использовать пользователя домена (или, что еще лучше, учетную запись управляемой службы домена), либо вы можете настроить пользователя пула приложений на СЕТЕВУЮ СЛУЖБУ, а затем вы можете предоставить разрешения MyDomain\MyWebServer$ ( знак доллара важен).

person Greg    schedule 27.12.2017