"Сбой сборки" в базе данных First Scaffold-DbContext

Я пытаюсь создать классы из базы данных (первый подход к базе данных EntityFramework).

Для удобства я более или менее хожу вместе с этим учебником: https://docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html

Я нахожусь в точке, где я запускаю эквивалент этой строки кода в консоли диспетчера пакетов Visual Studio:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -Verbose

Эта строка кода генерирует ошибку (при включенном режиме -Verbose):

Using startup project 'EFSandbox'.
Using project 'EntityFrameworkCore'
Build started...
Build failed.

Я не вижу других вариантов, которые производят какой-либо значимый вывод, и я не вижу документации по этой конкретной ошибке. Если это вообще помогает, у этого проекта в настоящее время нет файла project.json. Все находится в файле .csproj, который я не редактировал вручную.

Ответы

Ответ 1

Прежде чем запускать новую команду scaffold, убедитесь, что ваш проект собран.

Что часто случается со мной, так это то, что я начинаю писать строку кода, понимаю, что нужен новый столбец БД, иди, чтобы попытаться восстановить его, а затем через 20 минут понимаю, что причина, по которой моя сборка (и команда scaffold) не удалась, заключается в том, что я наполовину написана строка кода. К сожалению.


Если у вас есть несколько библиотек DLL, возможно, вы создаете неверный проект. Тогда "Сборка не удалась" происходит по ряду причин, вполне возможно, что у вас не установлен EFCore в этом проекте.

В консоли диспетчера пакетов есть проект по Default project и это, вероятно, где ваши файлы закончились.

Решение простое, и вам просто нужно добавить переключатель -Project к вашим опциям.

Это полная команда, которую я использую:

Scaffold-DbContext -Connection "Сервер = (локальный); База данных = DefenderRRCart; Интегрированная безопасность = True; Trusted_Connection = True;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

Примечание: -force перезапишет файлы, но не удалит те, которые больше не существуют. Если вы удаляете таблицы из вашей БД, вы должны удалить старые файлы сущностей самостоятельно (просто отсортируйте в проводнике по дате и удалите старые).

Полные варианты: https://docs.efproject.net/en/latest/miscellaneous/cli/powershell.html#scaffold-dbcontext

Ответ 2

Я знаю, что это старо, но я потратил некоторое время, пытаясь понять это сегодня, поэтому я надеюсь, что это кому-то поможет.

У меня есть проект.Net Core, но я хочу переместить мои файлы в библиотеку классов.Net Standard. DbContext-Scaffold в консоли диспетчера пакетов не работал для меня, но dotnet ef dbcontext scaffold в обычной командной строке dotnet ef dbcontext scaffold.

Я должен был установить эти пакеты в моей библиотеке классов:

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools

Мне нужно было установить проект.Net Core в качестве стартового проекта в моем решении, и этот проект должен был иметь ссылку на мою библиотеку классов. Я думаю, что последняя часть - это то, чего мне не хватало, что заставляло меня так долго чесать голову.

Наконец, я перешел в библиотеку классов из командной строки и запустил это:

dotnet ef dbcontext scaffold "<connection string>" Microsoft.EntityFrameworkCore.SqlServer -o <output folder> -s <relative path to my startup project>

Ответ 3

Использование VS2017 Preview 3,.NET Core 2 (PREVIEW) У меня были всевозможные проблемы, но в итоге я принял предложенный выше подход и создал совершенно новое решение.

  • Создано новое решение .NET Core
  • Изменен файл проекта и изменен с 1.0 на 2.0:  <TargetFramework>netcoreapp2.0</TargetFramework>
  • Закрытое/повторно открытое решение

Затем добавлена ​​структура Entity Framework:

  • В консоли PackageManager:
    • Установочный пакет Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0-preview2-final
    • Установочный пакет Microsoft.EntityFrameworkCore.Tools -Version 2.0.0-preview2-final
    • Установочный пакет Microsoft.EntityFrameworkCore.Design -Version 2.0.0-preview2-final
  • Отредактированный файл проекта и добавлен: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

Тогда;

  • Открыл командную строку Powershell и сменил каталог на Scaffold папка проекта
  • Ran: dotnet ef dbcontext scaffold "Сервер = DESKTOP-MB70B7U; База данных = ForexForme; Trusted_Connection = True "Microsoft.EntityFrameworkCore.SqlServer -o модели
    • Если вы ввели свою собственную строку подключения!
    • Модели - это имя моего каталога, где я помещаю все мои классы

Ответ 4

Для меня проблема заключалась в том, что я пытался настроить его в новом проекте пустой консоли внутри решения, у которого не было файлов, поэтому строительные леса пытались использовать этот проект как проект запуска и не могли найти Main. Я исправил его, добавив новый файл с пустым основным

Ответ 5

Построение проекта вручную Ctrl + Shift + B помогло мне увидеть ошибки, которые приводили к сбою сборки.

Ответ 6

У меня была эта проблема, даже когда я убедился, что мой проект (с установленной EF Core) был построен правильно. По-прежнему не удалось выполнить "Сбой сборки". сообщение, которое отображается при использовании флага -Verbsose.

Я должен был сделать это в моем случае:

  • Создайте броское решение для веб-приложений ASP.NET.
  • Добавить пакет EF Core NuGet в решение
  • Добавить пакет NuGet поставщика сервера EF Core Sql (потому что я использую SqlServer)
  • Добавить пакет NIGet для основных инструментов EF.
  • Переключить -Project в команде консоли диспетчера пакетов, чтобы указать на мой недавно созданный проект (и EF Core-provisioned). Последний шаг был только для хорошей меры, поскольку в моем отброшенном решении был только один проект.

Кажется, что для всего этого процесса требуется основной проект ASP.NET(или только проект .NET Core, который не является библиотекой классов), где-то в решении, предположительно заданном как проект запуска решения.

Ответ 7

Создайте законченное решение и посмотрите, где оно не работает. У меня были некоторые проекты NuGet, спрятанные в папке, которая не была собрана. Только при восстановлении решения я узнал, в чем проблема. Все нужно построить, иначе Scaffold потерпит неудачу.

Ответ 8

Убедитесь, что ваш проект не запущен, по какой-то причине эта команда не работает, пока мой API работает в фоновом режиме.

Ответ 9

Если Entity-Framework возвращает build failed, скорее всего, у вас есть какая-то ошибка в любом из ваших проектов.

Даже если проект, на котором вы запускаете команду, является чистым и не содержит ошибок, другие проекты в этом решении могут привести к build failed реакции build failed.

Решение

  • Восстановите все решение. Скорее всего, вы найдете эту ошибку в процессе восстановления решения.
  • Убедитесь, что проект, для которого вы хотите выполнить команду, выбран в раскрывающемся Default project по Default project в Package Manager Console
  • Перезапустите команду.

Ответ 10

Для меня мой проект построен в Visual Studio, но я должен был указать версию для "Microsoft.AspNetCore.App" при запуске Scaffold-DbContext.

Так что вместо:

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeFrameworkVersion>2.1.6</RuntimeFrameworkVersion>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App"/>
</ItemGroup>

Я должен был иметь:

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.6" />
</ItemGroup>

Ответ 11

Если в решении используется несколько проектов, проверьте проект по умолчанию в диспетчере пакетов.

Ответ 12

Подумайте, что ваша проблема заключается в том, что у вас должен быть проект project.json, чтобы объявить инструменты EFC. Попробуйте переписать в правильном типе проекта, и это может вызвать json.

Ответ 13

Благодаря вышесказанному перестройка проектного решения решила эту проблему. Некоторые важные предостережения для меня лично были:

  1. Выполнение dotnet build было недостаточно (я предполагал, что это было)!
  2. В меню Visual Studio выберите " Построение"> "Построить решение" (Ctrl + Shift + B).
    • Я считаю, что я просто пытался запустить dotnet build находясь внутри дочернего проекта (myProject.data)
    • Восстановление родительского проекта (myProject) было ключевым

Я надеюсь, что это помогает кому-то еще, кто был одинаково смущен!