"Сбой сборки" в базе данных 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
Благодаря вышесказанному перестройка проектного решения решила эту проблему. Некоторые важные предостережения для меня лично были:
- Выполнение
dotnet build
было недостаточно (я предполагал, что это было)! - В меню Visual Studio выберите " Построение"> "Построить решение" (Ctrl + Shift + B).
- Я считаю, что я просто пытался запустить
dotnet build
находясь внутри дочернего проекта (myProject.data) - Восстановление родительского проекта (myProject) было ключевым
Я надеюсь, что это помогает кому-то еще, кто был одинаково смущен!