Ошибка входа в базу данных при миграции EF6 (LocalDb)

Первый проект кода 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 реализация.

Есть ли у кого-нибудь понимание этого вопроса?


person Joe    schedule 06.02.2014    source источник
comment
У вас есть SQL Server Management Studio? Если это так, попробуйте подключиться к обеим базам данных, используя проверку подлинности Windows. Если вы можете (без ошибок доступа), это связано с кодом. если нет, это параметр конфигурации в локальной базе данных, который необходимо изменить.   -  person Brad Christie    schedule 06.02.2014


Ответы (7)


Если вы удалите файл БД, он все равно останется зарегистрированным в SqlLocalDB. Если LocalDb зависает из-за невозможности подключения (после удаления файла БД вручную) или сбоя входа в систему, см. ответы JSobell и CodingwithSpike здесь:

ef5-cannot-attach-the-file- 0-как-база-данных-1.

Запустите «sqllocaldb.exe stop v11.0» и «sqllocaldb.exe delete v11.0» из консоли PM.

ОБНОВЛЕНИЕ:

Еще проще использовать SSMS. Имя сервера: (локальный)\v11.0, проверка подлинности Windows. Это действительно лучший способ управления базами данных localdb.

person Joe    schedule 21.02.2014

Я работаю с VS 2013 и EF6.1.

У меня возникла аналогичная ошибка, когда я работаю с миграцией и удаляю базу данных. Я не смог воссоздать базу данных снова. Обнаружена ошибка из-за того, что экземпляр локальной базы данных SQLExpress работает в фоновом режиме и сохраняет с ним удаленное соединение с базой данных.

Ниже приведены шаги, чтобы справиться с этой ситуацией.

  1. Удалите файлы базы данных (.mdf и .ldf).
  2. Удалите папку миграции из своего приложения.
  3. Удалите все соединения базы данных с этой базой данных из соединений данных Server Explorer.
  4. Перейдите в командную строку Windows (ЕСЛИ VS 2012 или более ранней версии вам необходимо использовать командную строку VS).
  5. Запустите «sqllocaldb.exe stop v11.0» (это остановит службу v11.0)
  6. Запустите «sqllocaldb.exe delete v11.0» (это удалит службу v11.0)
  7. Перейдите в консоль диспетчера пакетов в Visual Studio.
  8. Запустите «Enable-Migrations» (это создаст папку миграции и содержимое)
  9. Запустите «Add-Migration init» (это сохранит изменения для следующей миграции)
  10. Запустите «Update-Database» (это снова создаст базу данных)
person Delush    schedule 08.04.2014

Я меняю Standard Security на Trusted Connection

Сервер=myServerAddress;База данных=myDataBase;Trusted_Connection=True;

в appsetting.json вы можете написать этот код

`{

  "ConnectionStrings": {
    "onlineStoreDB": "Server=.;Database=onlineStore;Trusted_Connection=True"
     },

    "Logging": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    },
    "AllowedHosts": "*"
  }`

Это сработало для меня.

person bah    schedule 05.02.2020

Обмен из строки подключения

Источник данных=(LocalDb)\v11.0;

to

Сервер=.\SQLExpress;

Это помогло мне в технике Code First во время миграции.

person rock_walker    schedule 27.12.2014

Это решит вашу проблему, и вы сможете обновить и добавить в модель столько методов и свойств, сколько захотите.

Примечания: Шаг 1{Если вы инициировали свою базу данных, как в учебнике}

Из консоли ПМ:

  1. Enable-Migrations -ContextTypeName ContosoUniversity.DAL.SchoolContext

  2. добавить-миграция начальный

  3. обновление базы данных

person sburns    schedule 05.07.2015

Я немного опоздал, но столкнулся с той же проблемой при выполнении Начало работы с EF6 с помощью MVC5.

Проблема возникает из-за недопустимой инициализации базы данных в примере.

Изменять

public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext>

to

public class SchoolInitializer : CreateDatabaseIfNotExists<SchoolContext>

и он создаст базу данных без проблем.

Метод инициализации, который используется в примере, по умолчанию не создает новую базу данных. Не уверен, баг это или нет.

person Daniil Ivanov    schedule 07.07.2016
comment
У меня была такая же ошибка, когда я проходил этот учебник. В первом руководстве/начальных шагах было указано, что БД будет воссоздаваться каждый раз при запуске приложения, и это будет изменено на следующих шагах. Для тех, кто все еще находится на начальных этапах, все, что вам нужно сделать, это отключить LocalDb в обозревателе серверов, чтобы увидеть новый столбец электронной почты в таблице Student. Но выполнение предложения @Daniil Ivanov выше также работает. - person Annie Lagang; 03.10.2016

'PM› enable-migrations Enable-Migrations устарел. Используйте Add-Migration, чтобы начать использовать миграции».

person bah    schedule 08.08.2020