“Помилка збірки” на базі даних First Scaffold-DbContext


83

Я намагаюся генерувати класи з бази даних (перший підхід до бази даних EntityFramework).

Для зручності я більш-менш ходжу разом з цим посібником: https://docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html

Я перебуваю в точці, коли я запускаю еквівалент цього рядка коду в консолі Visual Studio Package Manager:

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, який я не редагував вручну.


6
Чи отримуєте помилки / попередження при перекомпіляції всього рішення?
Ігнас,

@Ignas Зробив це, і так, я отримав помилки залежності, яких не було до моєї перекомпіляції, і які просто не повинні були існувати. Замість того, щоб намагатися боротися з цим, я переробив рішення. У мене зараз нова проблема. Думаю, мені слід трохи пізніше зробити нове запитання (якщо це схоже) на відміну від редагування цього.
LightToTheEnd Кінець

Думаєте, ваша проблема полягає в тому, що ви повинні мати project.json, щоб заявити про інструменти EFC. Спробуйте переписати правильний тип проекту, і це може створити json.
Вебезін

1
Для мене це змусило це переконатись, що все рішення (а не лише проект) успішно побудовано перед тим, як видати команду ешафоту.
manish gupta

Я хотів коротко оновити це питання, оскільки йому було приділено багато уваги - це було набагато старішою версією EF Core, ніж те, що доступне на даний момент, і після кількох інших проблем рішенням, з яким ми закінчили, було EF6, поки більше часу на поселення. Навіть EF6 створював проблеми, але ми налаштували його набагато надійніше.
LightToTheEnd

Відповіді:


158

Дві найважливіші поради:

[1] - Переконайтесь, що ваш проект повністю побудований, перш ніж запускати нову команду лісів.

Інакше ...

  • Ви почнете писати рядок коду.
  • Ви зрозумієте, що у вашій моделі відсутній необхідний стовпець БД.
  • Ви підете спробувати покласти його на риштування.
  • Через двадцять хвилин ви зрозумієте, що причина вашої збірки (і команди ешафота) невдала полягає в тому, що у вас буквально є наполовину написаний рядок коду. Ой!

[2] - Перевірте в контролі джерела або зробіть копію:

  • Дозволяє легко перевірити, що змінилося.
  • Дозволяє відкат, якщо потрібно.

Якщо вам не пощастить або помилиться, ви можете отримати дуже прикрі проблеми з "куркою та яйцем".


Інші проблеми:

Якщо у вас кілька бібліотек DLL, переконайтеся, що ви не створюєте неправильний проект . Повідомлення "Не вдалося побудувати" може виникати з багатьох причин, але найдурнішим було б, якщо у вас не встановлений EFCore в проекті, який ви виконуєте.

У консолі диспетчера пакетів є Default projectвипадаючий список, і, можливо, саме там опинилися ваші нові файли, якщо ви пропустили очікувані зміни.

Кращим рішенням, ніж запам'ятовування встановлення випадаючого списку, є додавання -Projectперемикача до команди будівельних лісів.

Це повна команда, яку я використовую:

Для EF Core 2

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

Для EF Core 3

dotnet ef dbcontext scaffold "Server = tcp: XXXXX.database.windows.net, 1433; Початковий каталог = DATABASE_NAME; Зберегти інформацію про безпеку = False; Ім'я користувача = ІМЯ ІМЯ; Пароль = ПАРОЛЬ; MultipleActiveResultSets = False; Encrypt = True; TrustServerseter ; Час очікування підключення = 30; " Microsoft.EntityFrameworkCore.SqlServer -o DB.Models --context-dir DB.Contexts --context RRDBContext --project RR.EF.csproj --force --use-database-names

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


Повне посилання на риштування:

EF Core 2:

https://docs.efproject.net/en/latest/miscellaneous/cli/powershell.html#scaffold-dbcontext (це

EF Core 3:

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet


також переконайтесь, що у файлах Project.JSON немає коментарів
Simon_Weaver

Так, ви можете перекласти проект у "бібліотеку класів", якщо віддаєте перевагу логіці доступу до даних в окремому файлі, але основним проектом повинен бути основний проект
aspnet

Порада. Обов’язково запустіть із консолі менеджера пакетів. Мені не вдається запустити командний рядок Visual Studio
Simon_Weaver,

1
що робити, якщо, наприклад, ви видалили файл сутності? Риштування не буде працювати, оскільки вам не вистачає цього файлу, але воно не буде, оскільки воно не будується. Досить прикро.
sofsntp

6
Надокуч, здається, вам потрібно вміти будувати ціле рішення. У мене були помилки в інших проектах, але проект на ешафот був нормальним. Рішенням було обрати інші проекти та «розвантажити» їх. Потім риштування, потім перезавантажте.
Сем

11

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

У мене є проект .Net Core, але я хочу перекласти свої файли на бібліотеку класів .Net Standard. 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>

11

Створення проекту вручну, натиснувши Ctrl + Shift + B, допомогло мені побачити помилки, які спричинили збій збірки.


Так, складання рішення допомогло і мені.
П'єро Альберто

Як прийнята відповідь вже говорилася роками раніше. "Переконайтеся, що ваш проект повністю побудований, перш ніж запускати нову команду лісів."
Герт Арнольд

5

У мене все ще була ця проблема, навіть коли я переконався, що мій проект (на якому встановлено EF Core) побудований правильно. Це все ще не вдалося з "Помилка збірки". повідомлення, яке видно при використанні -Verbsoseпрапора.

Мені довелося зробити це у моєму випадку:

  • Створіть одноразове рішення для веб-додатків ASP.NET Core
  • Додайте до рішення пакет EF Core NuGet
  • Додайте пакет NuGet провайдера сервера EF Core Sql (оскільки я використовую SqlServer)
  • Додайте пакет EF Core Tools NuGet
  • Увімкніть -Projectкоманду консолі менеджера пакетів, щоб вказати на мій нещодавно створений (і забезпечений EF Core) проект. Останній крок був для доброї міри, оскільки в моєму рішення про викидання був лише один проект.

Здається, що весь цей процес вимагає основного проекту ASP.NET (або просто проекту .NET Core, який не є бібліотекою класів) десь у рішенні, імовірно встановленому як проект запуску рішення.


2
Це, мабуть, один з найбільш корисних записів на цій сторінці. Прапор -verbose повинен рухатись у правильному напрямку, оскільки він охоплює безліч речей, які можуть зіпсуватися з ешафотом.
Regianni

5

Переконайтеся, що ваш проект не запущений, чомусь ця команда не працює, поки мій API працює у фоновому режимі.


4

Використовуючи VS2017 Preview 3, .NET Core 2 (PREVIEW), у мене були всілякі проблеми, але врешті-решт я скористався запропонованим вище підходом і створив нове рішення.

  1. Створено нове рішення .NET Core
  2. Відредаговано файл проекту та змінено 1.0 на 2.0: <TargetFramework>netcoreapp2.0</TargetFramework>
  3. Закрите / повторно відкрите рішення

Потім додано Entity Framework:

  1. У консолі 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
  2. Відредаговано файл проекту та додано: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

Тоді;

  1. Відкрив командний рядок Powershell і змінив каталог у папку проекту Scaffold
  2. Ran: dotnet ef dbcontext scaffold "Server = DESKTOP-MB70B7U; Database = ForexForme; Trusted_Connection = True" Microsoft.EntityFrameworkCore.SqlServer -o Models
    • Де ви вводите свій власний рядок підключення!
    • Моделі - це назва мого каталогу, куди я кладу всі свої класи

4

Створіть повне рішення і подивіться, де воно не вдається. У мене були сховані деякі проекти NuGet у папці, яка не була побудована. Тільки під час відновлення рішення я дізнався, в чому проблема. Все потрібно будувати, інакше Ешафот вийде з ладу.


3

Для мене проблема полягала в тому, що я намагався встановити його в новому проекті порожньої консолі всередині рішення, в якому не було файлів, тому будівельні ліси намагалися використовувати цей проект як стартовий проект і не могли знайти Main. Я виправив це, додавши новий файл із порожнім main


3

Якщо в рішенні використовується кілька проектів, перевірте проект за замовчуванням у менеджері пакетів.


3

Завдяки вищесказаному, відновлення проектного рішення це вирішило. Деякі найважливіші застереження для мене особисто:

  1. Запуск dotnet buildне було достатньо (я asssumed це було)!
  2. У візуальному меню студії, Будувати> Будувати рішення (Ctrl + Shift + B)
    • Я вважаю, що я просто намагався запустити dotnet buildкоманду, перебуваючи всередині дочірнього проекту (myProject.data)
    • Ключовим фактором було відновлення рішення батьківського проекту (myProject)

Я сподіваюся, що це допоможе ще комусь, хто був однаково розгублений!


3

Я вирішив це клацанням правою кнопкою миші на проектах, а "Вивантажити проект" дозволив лише проект EF та запустив команди


2

Якщо сутність-фреймворк повертається build failed, швидше за все, у вас є якась помилка в будь-якому з ваших проектів.

Навіть якщо проект, над яким ви виконуєте команду, чистий і без помилок, інші проекти в цьому рішенні можуть спричинити build failedвідповідь.

Рішення

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

1

Для мене мій проект побудований у 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>

1

Переконайтеся, що ваша збірка працює нормально.
Запустіть команду scaffold з консолі пакета, ваша команда повинна працювати:

Scaffold-DbContext 'Data Source=TEST-XY010;Initial Catalog=TESTDB;Trusted_Connection=True' Microsoft.EntityFrameworkCore.SqlServer -Context HOPWAContext -OutputDir TESTModel -Force

1

Я вирішив це, зупинивши свій сервер, а потім запустивши його знову.


0

Сьогодні це перестало працювати для мене. Тож я спробував запустити команду dotnet scaffold із командного рядка, і це спрацювало вперше. Не питайте мене !!


Він знову зламався, перш ніж я виявив прапор --verbose, який доставив стек, який дозволив мені визначити проблему. Можливо, допомогло б, якщо помилка була виведена незалежно від цього прапора.
Regianni

-1

Переконайтесь, що у вас є всі пакунки, і натисніть ctrl + shift + b, щоб створити рішення. Мені це вдається.


Як прийнята відповідь вже говорилася роками раніше. "Переконайтеся, що ваш проект повністю побудований, перш ніж запускати нову команду лісів."
Герт Арнольд

-1
  1. Переконайтеся, що ваш проект не запущений
  2. Переконайтеся, що ваш проект компілюється

Це спрацювало для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.