Skip to content

Instantly share code, notes, and snippets.

@sampletext32
Last active June 9, 2020 23:00
Show Gist options
  • Save sampletext32/39f88723bbf6a2a9256c965accb10ae0 to your computer and use it in GitHub Desktop.
Save sampletext32/39f88723bbf6a2a9256c965accb10ae0 to your computer and use it in GitHub Desktop.

Перед началом!

Убедитесь в правильном наименовании проектов

  • Infrastructure
  • DbConsole
  • Entities

В моём случае всё выглядит вот так

2020-06-02_21-49-46

Убедитесь, что типы ваших проектов - .NET Core

Для этого откройте свойства каждого проекта в решении.

2020-06-02_21-52-28

И проверьте “Целевая рабочая среда”. Должно быть .NET Core 3.1

1

Создаются они вот так.

2020-06-02_21-58-38

2020-06-02_21-59-04

2020-06-02_21-59-33

Как исправить

На этом этапе, если отличается - скопируйте папку с этим отдельным проектом куда-нибудь. Потом удалите проект в решении. Потом удалите папку с проектом из папки решения (Это важно). После этого добавьте в решение правильный проект. Скопируйте из сделанного бэкапа все файлы кода в созданный проект (кроме файла .csproj)

Проверьте, что Infrastructure и Entities в “Тип выходных данных” имеют “Библиотека классов”, а DbConsole и ASP проект – “Консольное приложение"

1

На этом этапе если что-то отличается – исправляйте. Пофиксить в будущем практически невозможно.

Непосредственно миграция

1. Проверьте наличие AppDbContext.cs в проекте Infrastructure.

2. Установите все ПРАВИЛЬНЫЕ зависимости NuGet в проекты.

Для того, чтобы устанавливать зависимости для конкретного проекта, нажмите правой кнопкой мыши по нужному проекту и выберите “Управление пакетами Nuget”. Заданные зависимости вводить в строку поиска во вкладке “Обзор”. При любой ошибке в наличии или отсутствии пакетов придётся начинать сначала.

2020-06-02_22-08-28

Для ASP проекта

  • Microsoft.AspNetCore.Mvc.NewtonsoftJson (3.1.4)
  • Microsoft.EntityFrameworkCore (3.1.4)
  • Microsoft.VisualStudio.Web.CodeGeneration.Design (3.1.3)

Для Entities

  • Microsoft.EntityFrameworkCore (3.1.4)
  • NewtonsoftJson (12.0.3)
  • System.ComponentModel.Annotations (4.7.0)

Для Infrastructure

  • EntityFramework (6.4.4)
  • Microsoft.EntityFrameworkCore (3.1.4)
  • Microsoft.EntityFrameworkCore.SqlServer (3.1.4)
  • Microsoft.EntityFrameworkCore.Tools (3.1.4)

Для DbConsole

  • Microsoft.EntityFrameworkCore (3.1.4)
  • Microsoft.EntityFrameworkCore.Design (3.1.4)

3. Свяжите все проекты между собой.

Зависимости -> Добавить ссылку на проект -> Нужные отметьте галочками.

2020-06-02_22-19-59

Как правило должно быть вот так, но может отличаться в вашем конкретном проекте

  • ASP Зависит от Infrastructure и Entities
  • DbConsole Зависит от Infrastructure и Entities
  • Infrastructure Зависит от Entities

4. Откройте “Консоль диспетчера пакетов”.

Эта консоль работает со всеми проектами сразу.

2020-06-02_22-10-11

5. Выполните команду

Install-Package EntityFramework –IncludePrerelease Это позволит обновить EF до самой последней версии в решении.

2020-06-02_22-14-00

6. Выполните команду

dotnet tool install --global dotnet-ef Это позволит установить менеджер EF для всего вашего .NET окружения и будет работать со всеми проектами. --global виноват.

7. Выполните команду

“enable-migrations” чтобы непосредственно включить миграции как таковые. На этом этапе допустимы ошибки в консоли при выполнении этой команды. Например, такие

image

Все ошибки, связанные с контекстом игнорируйте.

8. Измените файл проекта DbConsole.csproj в текстовом редакторе, например, в Notepad++.

Чтобы это сделать нажмите правой кнопкой мыши по проекту DbConsole в решении и выберите Открыть папку в проводнике

image

В открывшейся папке сразу будет выделен нужный файл.

Добавьте

<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />

В ItemGroup с зависимостями от проектов (они все содержат .csproj на конце)

2020-06-02_22-24-14

Эта махинация с файлом проекта конкретно укажет версию dotnet ef для вашего проекта.

9. Откройте PowerShell в папке проекта DbConsole

Чтобы это сделать нажмите правой кнопкой мыши по проекту DbConsole в решении и выберите Открыть папку в проводнике

image

В открывшейся папке сразу будет выделен проект

Он вам не нужен.

Зажмите Shift и правой кнопкой мыши по свободному месту в папке.

image

Все последующие команды выполняются в PowerShell

10. Выполните команду

dotnet restore

Это загрузит все необходимые модули для миграций

11. Выполните команду

dotnet ef migrations add init --context Infrastructure.AppDbContext --project ../Infrastructure -o Data/Migrations -v

Здесь init - название вашей миграции, рекомендую назвать с большой буквы.

А Infrastructure.AppDbContext - путь к файлу AppDbContext внутри проекта Infrastructure.

В данном случае AppDbContext лежит в корне проекта. У ЕА скорее всего будет Infrastructure.DataAccess.AppDbContext

-v указывает на расширенный вывод от вызова команды.

У меня это выглядит вот так.

image

После выполнения должен быть результат Done

На этом этапе добавлена миграция, но не создана БД.

12. Выполните команду

dotnet ef database update --context Infrastructure.AppDbContext --project ../Infrastructure

Здесь Infrastructure.AppDbContext - путь к файлу AppDbContext внутри проекта Infrastructure.

Это непосредственно создаст БД

Успех

Наблюдайте прекрасную миграцию в вашем проекте Infrastructure

image

Наблюдайте прекрасную БД в обозревателе серверов SQL

image

image

В случае обновления классов, репозиториев или Не Дай Бог БД

Выполняйте пункт 9 и 12.

Если вам потребовалось удалить миграцию

Выполните пункт 9 и команду

Unapply migration

dotnet ef database update 0

Remove migration

dotnet ef migrations remove --context Infrastructure.AppDbContext --project ../Infrastructure -v

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment