“Xây dựng không thành công” trên Database First Scaffold-DbContext


81

Tôi đang cố gắng tạo các lớp từ cơ sở dữ liệu (cách tiếp cận cơ sở dữ liệu đầu tiên của EntityFramework).

Để thuận tiện, tôi ít nhiều sẽ xem hướng dẫn này: https://docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html

Tôi đang ở thời điểm mà tôi đang chạy dòng mã tương đương này trong Bảng điều khiển Trình quản lý Gói Visual Studio:

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

Dòng mã này đang tạo ra lỗi (khi bật chế độ -Verbose):

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

Tôi không thấy tùy chọn nào khác tạo ra bất kỳ đầu ra có ý nghĩa nào và tôi không thấy tài liệu nào về lỗi cụ thể này. Nếu nó có ích, dự án này không có tệp project.json, hiện tại. Mọi thứ đều nằm trong tệp .csproj mà tôi chưa chỉnh sửa thủ công.


6
Bạn có gặp bất kỳ lỗi / cảnh báo nào khi biên dịch lại toàn bộ giải pháp không?
Ignas

@Ignas Đã làm điều đó, và vâng, tôi đã gặp lỗi phụ thuộc không tồn tại trước khi tôi biên dịch lại và điều đó đáng lẽ không tồn tại. Thay vì cố gắng chống lại nó, tôi đã làm lại giải pháp. Tuy nhiên, tôi có một vấn đề mới bây giờ. Đoán rằng tôi nên đặt một câu hỏi mới sau một chút (nếu câu hỏi này tương tự) thay vì chỉnh sửa câu hỏi này.
LightToTheEnd

Hãy nghĩ rằng vấn đề của bạn là bạn phải có một project.json để khai báo các công cụ EFC. Hãy thử viết lại theo đúng loại dự án và điều này có thể tạo ra một json.
Webezine

1
Đối với tôi, điều khiến nó hoạt động là đảm bảo toàn bộ giải pháp (không chỉ dự án) được xây dựng thành công trước khi ban hành lệnh giàn giáo.
manish gupta

Tôi muốn cập nhật ngắn gọn câu hỏi này vì nó đã gây được nhiều sự chú ý - đây là phiên bản cũ hơn nhiều của EF Core so với những gì hiện có và sau một số vấn đề khác, giải pháp mà chúng tôi đã kết thúc là EF6 cho đến khi Core có thêm thời gian để giải quyết. Ngay cả EF6 cũng đặt ra vấn đề, nhưng chúng tôi đã thiết lập nó một cách đáng tin cậy hơn nhiều.
LightToTheEnd

Câu trả lời:


152

Hai mẹo quan trọng nhất:

[1] - Đảm bảo rằng dự án của bạn được xây dựng hoàn chỉnh trước khi bạn chạy lệnh giàn giáo mới.

Nếu không thì...

  • Bạn sẽ bắt đầu viết một dòng mã.
  • Bạn sẽ nhận ra rằng một cột DB bắt buộc bị thiếu trong mô hình của bạn.
  • Bạn sẽ cố gắng dựng lên nó.
  • Hai mươi phút sau, bạn sẽ nhận ra lý do mà lệnh xây dựng (và lệnh giàn giáo) của bạn không thành công là vì bạn thực sự có một nửa dòng mã được viết. Giáo sư!

[2] - Kiểm tra kiểm soát nguồn hoặc tạo một bản sao:

  • Cho phép bạn dễ dàng xác minh những gì đã thay đổi.
  • Cho phép khôi phục nếu cần.

Bạn có thể gặp một số vấn đề 'gà và trứng' rất khó chịu nếu bạn không may mắn hoặc mắc sai lầm.


Các vấn đề khác:

Nếu bạn có nhiều DLL, hãy đảm bảo rằng bạn không tạo ra dự án sai . Thông báo 'Xây dựng không thành công' có thể xảy ra vì nhiều lý do, nhưng điều ngớ ngẩn nhất sẽ là nếu bạn chưa cài đặt EFCore trong dự án mà bạn đang tham gia.

Trong bảng điều khiển trình quản lý gói có một Default projectmenu thả xuống và đó có thể là nơi các tệp mới của bạn đã kết thúc nếu bạn bỏ lỡ một thay đổi dự kiến.

Một giải pháp tốt hơn so với việc nhớ đặt danh sách thả xuống là thêm công -Projecttắc vào lệnh giàn giáo của bạn.

Đây là lệnh đầy đủ tôi sử dụng:

Đối với EF Core 2

Scaffold-DbContext -Connection "Máy chủ = (cục bộ); Cơ sở dữ liệu = DefenderRRCart; Bảo mật tích hợp = True; Trusted_Connection = True;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

Đối với EF Core 3

dotnet ef dbcontext angle "Server = tcp: XXXXX.database.windows.net, 1433; Initial Catalog = DATABASE_NAME; Persist Security Info = False; User ID = USERNAME; Password = PASSWORD; MultipleActiveResultSets = False; Encrypt = True; TrustServerCertificate = False ; Thời gian chờ kết nối = 30; " Microsoft.EntityFrameworkCore.SqlServer -o DB.Models --context-dir DB.Contexts --context RRDBContext --project RR.EF.csproj --force --use-database-names

Lưu ý: -force sẽ ghi đè lên các tệp nhưng không xóa những tệp không tồn tại nữa. Nếu bạn xóa các bảng khỏi DB của mình, bạn phải tự xóa các tệp thực thể cũ (chỉ cần sắp xếp trong Explorer theo ngày và xóa các tệp cũ).


Tham khảo đầy đủ giàn giáo:

EF Core 2:

https://docs.efproject.net/en/latest/misready/cli/powershell.html#scaffold-dbcontext (cái này

EF Core 3:

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


cũng đảm bảo các file Project.JSON không có ý kiến trong họ
Simon_Weaver

Và có bạn có thể giàn giáo vào một dự án 'thư viện lớp' nếu bạn thích Logic DATAACCESS của bạn trong một file riêng biệt, nhưng các dự án tiểu học cần phải được một dự án aspnet lõi
Simon_Weaver

Mẹo: Đảm bảo chạy từ bảng điều khiển trình quản lý gói. Không hoạt động đối với tôi khi chạy từ dấu nhắc lệnh Visual Studio
Simon_Weaver

1
bạn sẽ làm gì nếu chẳng hạn như bạn đã xóa một tệp thực thể? Scaffold sẽ không hoạt động vì bạn đang thiếu tệp này nhưng nó sẽ không hoạt động vì nó không được xây dựng. Khá khó chịu.
sofsntp

6
Thật khó chịu, bạn dường như cần phải có khả năng xây dựng toàn bộ giải pháp. Tôi đã có lỗi trong các dự án khác nhưng dự án lên đoạn đầu vẫn ổn. Giải pháp là chọn các dự án khác và "dỡ bỏ" chúng. Sau đó giàn giáo, sau đó tải lại.
Sam

11

Tôi biết điều này là cũ, nhưng tôi đã dành một khoảng thời gian để tìm ra điều này ngày hôm nay, vì vậy tôi hy vọng điều này sẽ giúp ai đó.

Tôi có một dự án .Net Core nhưng tôi muốn đưa các tệp của mình vào thư viện lớp .Net Standard. DbContext-Scaffoldtrong bảng điều khiển trình quản lý gói không hoạt động đối với tôi, nhưng dotnet ef dbcontext scaffoldtrong một dấu nhắc lệnh thông thường thì có.

Tôi đã phải cài đặt các gói này trong thư viện lớp của mình:

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

Tôi phải đặt dự án .Net Core làm dự án khởi động trong giải pháp của mình và dự án đó phải có tham chiếu đến thư viện lớp của tôi . Tôi nghĩ rằng phần cuối cùng là điều tôi đã bỏ lỡ khiến tôi phải vò đầu bứt tai trong suốt thời gian dài.

Cuối cùng, tôi đã cd vào thư viện lớp từ dấu nhắc lệnh và chạy điều này:

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

10

Xây dựng dự án theo cách thủ công bằng cách nhấn Ctrl + Shift + B đã giúp tôi xem các lỗi khiến quá trình xây dựng không thành công.


Yah, việc biên soạn giải pháp cũng giúp tôi.
Piero Alberto

Như câu trả lời được chấp nhận đã nói nhiều năm trước. "Đảm bảo rằng dự án của bạn được xây dựng hoàn chỉnh trước khi bạn chạy lệnh giàn giáo mới."
Gert Arnold

5

Đảm bảo rằng dự án của bạn không chạy, vì một số lý do, lệnh này không hoạt động trong khi API của tôi đang chạy trong nền.


4

Tôi vẫn gặp sự cố này ngay cả khi tôi đảm bảo rằng dự án của mình (đã được cài đặt EF Core) được xây dựng chính xác. Nó vẫn không thành công với "Xây dựng không thành công." thông báo này hiển thị khi sử dụng -Verbsosecờ.

Tôi đã phải làm điều này trong trường hợp của tôi:

  • Tạo giải pháp ứng dụng web ASP.NET Core loại bỏ
  • Thêm gói EF Core NuGet vào giải pháp
  • Thêm gói NuGet của nhà cung cấp EF Core Sql Server (vì tôi đang sử dụng SqlServer)
  • Thêm gói NuGet của EF Core Tools
  • Chuyển -Projecttrong lệnh bảng điều khiển trình quản lý gói để trỏ đến dự án mới được tạo (và EF Core-cung cấp) của tôi. Bước cuối cùng chỉ là một biện pháp tốt, vì chỉ có một dự án trong giải pháp vứt bỏ của tôi.

Có vẻ như toàn bộ quá trình này yêu cầu một dự án lõi ASP.NET (hoặc chỉ một dự án .NET Core không phải là một thư viện lớp) ở đâu đó trong giải pháp, có lẽ cũng được đặt làm dự án khởi động giải pháp.


1
Đây có lẽ là một trong những mục hữu ích hơn trên trang này. Cờ -verbose nên đẩy theo hướng chính xác vì nó bao hàm vô số thứ có thể xảy ra sai với giàn giáo.
Regianni

4

Sử dụng VS2017 Preview 3, .NET Core 2 (PREVIEW), tôi đã gặp phải tất cả các vấn đề, nhưng cuối cùng tôi đã áp dụng cách tiếp cận được đề xuất ở trên và tạo ra một giải pháp hoàn toàn mới.

  1. Đã tạo giải pháp .NET Core mới
  2. Đã chỉnh sửa tệp dự án và thay đổi 1.0 thành 2.0: <TargetFramework>netcoreapp2.0</TargetFramework>
  3. Giải pháp đóng / mở lại

Sau đó, thêm Khung thực thể:

  1. Trong bảng điều khiển PackageManager:
    • Gói cài đặt Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0-preview2-final
    • Gói cài đặt Microsoft.EntityFrameworkCore.Tools -Version 2.0.0-preview2-final
    • Gói cài đặt Microsoft.EntityFrameworkCore.Design -Version 2.0.0-preview2-final
  2. Đã chỉnh sửa tệp dự án và thêm vào: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

Sau đó;

  1. Mở dấu nhắc lệnh Powershell và thay đổi thư mục thành thư mục dự án Scaffold
  2. Ran: dotnet ef dbcontext giàn giáo "Server = DESKTOP-MB70B7U; Database = ForexForme; Trusted_Connection = True" Microsoft.EntityFrameworkCore.SqlServer -o Models
    • Nơi bạn đặt chuỗi kết nối của riêng bạn!
    • Mô hình là tên thư mục của tôi, nơi tôi đặt tất cả các lớp của mình

4

Xây dựng giải pháp hoàn chỉnh và xem nó không thành công ở đâu. Tôi đã ẩn một số dự án NuGet trong một thư mục không được xây dựng. Chỉ trong khi xây dựng lại giải pháp, tôi mới phát hiện ra vấn đề là gì. Mọi thứ cần phải xây dựng nếu không thì Scaffold sẽ thất bại.


3

Đối với tôi, vấn đề là tôi đang cố gắng thiết lập nó trong một dự án bảng điều khiển trống mới bên trong giải pháp, không có tệp, vì vậy giàn giáo đã cố gắng sử dụng dự án này như một dự án khởi động và không thể tìm thấy Main. Tôi đã sửa nó bằng cách thêm một tệp mới với một tệp chính trống


3

Nhờ những điều trên, việc xây dựng lại giải pháp dự án đã giải quyết được điều này. Một số lưu ý quan trọng đối với cá nhân tôi là:

  1. Chạy dotnet buildlà không đủ (tôi đã giả định như vậy)!
  2. Trong menu studio trực quan, Xây dựng> Giải pháp xây dựng (Ctrl + Shift + B)
    • Tôi tin rằng tôi chỉ đơn giản là cố gắng chạy dotnet buildlệnh khi ở trong một dự án con (myProject.data)
    • Xây dựng lại giải pháp dự án mẹ (myProject) là chìa khóa

Tôi hy vọng điều đó sẽ giúp ích cho những người khác đang bối rối như nhau!


2

Nếu bạn sử dụng nhiều dự án trong giải pháp, hãy kiểm tra dự án mặc định trong trình quản lý gói.


2

Tôi đã giải quyết nó bằng cách nhấp chuột phải vào các dự án và "Unload Project" chỉ cho phép dự án EF và chạy các lệnh


1

Nếu entity-framework trả về build failed, hầu hết có thể là bạn mắc phải lỗi nào đó trong bất kỳ dự án nào của mình.

Ngay cả khi dự án bạn đang chạy lệnh, là sạch và không có lỗi, các dự án khác trong giải pháp đó có thể gây ra build failedphản hồi.

Giải pháp

  • Xây dựng lại toàn bộ giải pháp. Hầu hết có thể bạn sẽ tìm thấy lỗi đó trong quá trình xây dựng lại giải pháp.
  • Đảm bảo rằng dự án bạn muốn chạy lệnh được chọn trong Default projectmenu thả xuống bên trongPackage Manager Console
  • Chạy lại lệnh.

1

Đối với tôi, dự án của tôi được xây dựng trong Visual Studio nhưng tôi phải chỉ định phiên bản cho "Microsoft.AspNetCore.App" khi chạy Scaffold-DbContext.

Vì vậy, thay vì:

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

Tôi phải có:

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

1

Đảm bảo công trình của bạn hoạt động tốt.
Chạy lệnh giàn giáo từ bảng điều khiển gói, lệnh của bạn sẽ hoạt động:

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

1

Tôi đã giải quyết nó bằng cách dừng máy chủ của mình và sau đó chạy lại.


0

Điều này đã ngừng hoạt động đối với tôi ngày hôm nay. Vì vậy, tôi đã thử chạy lệnh dotnet giàn giáo từ dòng lệnh và nó hoạt động lần đầu tiên. Đừng hỏi tôi !!


Nó lại bị hỏng trước khi tôi phát hiện ra cờ --verbose, cờ này đã phân phối hệ thống ngăn xếp cho phép tôi xác định vấn đề. Có thể sẽ hữu ích nếu lỗi được xuất ra một cách không khách quan của cờ này.
Regianni

-1

Đảm bảo bạn có tất cả các gói và nhấn ctrl + shift + b để xây dựng giải pháp. Nó hoạt động với tôi.


Như câu trả lời được chấp nhận đã nói nhiều năm trước. "Đảm bảo rằng dự án của bạn được xây dựng hoàn chỉnh trước khi bạn chạy lệnh giàn giáo mới."
Gert Arnold

-1
  1. Đảm bảo rằng dự án của bạn không chạy
  2. Đảm bảo rằng dự án của bạn đang biên dịch

Điều đó đã làm việc cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.