Первый проект кода VS 2013 MVC5.
Я работаю через ASP.NET Начало работы с EF6 использую учебник MVC5, чтобы быть в курсе последних изменений, и у меня возникла проблема с миграциями. В первом модуле база данных создается с помощью инициализатора базы данных:
<contexts>
<context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">
<databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />
</context>
</contexts>
и эта строка подключения:
<connectionStrings>
<add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>
Это прекрасно работает. В модулях Code First Migrations и Deployment настраиваются миграции. Инициализатор закомментирован, а имя БД изменено на ContosoUniversity2:
<connectionStrings>
<add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>
Когда затем update-database
запускается из консоли Packager Manager, происходит сбой с сообщением об ошибке:
Cannot open database "ContosoUniversity2" requested by the login. The login failed.
Login failed for user 'MyMachine\MyUser'.
Я повторно запускал оба сценария несколько раз с одним и тем же пользователем и с теми же результатами. Если я изменю Initial Catalog
на AttachDbFilename=|DataDirectory|\ContosoUniversity2;
, update-database
преуспеет (теперь БД находится в папке App-Data проекта, а не в корне профиля пользователя):
<connectionStrings>
<add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0; AttachDbFilename=|DataDirectory|\ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>
Однако вы должны использовать Initial Catalog
при развертывании. Производственная строка подключения задается отдельно в Web.Release.Config, чтобы это работало.
Вопрос в том, зачем нужен фикс, почему Initial Catalog
не работает с update-database
на стороне разработки?
Обновление 1:
Проблема не в миграции, а в LocalDb
MyUser
имеет полные права на SQLExpress
(sysadmin
). Я могу войти в SSMS
под MyUser
и полностью управлять DBs
. Я провел несколько тестов. Несмотря на то, что я создал начальную БД для учебника как MyUser
, теперь она выдает ошибку входа в систему, если я пересобираю приложение с нуля и использую databaseInitialzer
. Если я запускаю VS
под Admin
, то и databaseInitialzer
, и update-database
работают без проблем. Если я затем скопирую DBs
из корня профиля пользователя Admin's
в MyUser's
, а затем запущу VS
, а не как Admin
, войдя в систему как MyUser
, то и databaseInitialzer
, и update-database
будут работать, если DB
ранее существовал.
Если я изменю connectionString
на AttachDbFileName
и запущу либо databaseInitialzer
, либо update-database
, MyUser
сможет создать DB
в папке App_Data
, доказывая, что MyUser
имеет DB
права на создание. MyUser
очевидно имеет полные права на корень собственного профиля пользователя. Что-то не так с LocalDb реализация.
Есть ли у кого-нибудь понимание этого вопроса?