【问题标题】:"Build failed" on Database First Scaffold-DbContextDatabase First Scaffold-DbContext 上的“构建失败”
【发布时间】:2016-08-15 18:49:34
【问题描述】:

我正在尝试从数据库生成类(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 文件中,我没有手动编辑。

【问题讨论】:

  • 重新编译整个解决方案时是否收到任何错误/警告?
  • @Ignas 做到了,是的,我得到了在重新编译之前不存在的依赖错误,而且不应该存在。我没有尝试与之抗争,而是重新制定了解决方案。不过,我现在有一个新问题。我想我应该稍后再提出一个新问题(如果这个问题相似的话),而不是编辑这个问题。
  • 认为您的问题是您必须有一个 project.json 才能声明 EFC 工具。尝试以正确的项目类型重写,这可能会生成一个 json。
  • 对我来说,它的工作原理是确保整个解决方案(不仅仅是项目)在发出脚手架命令之前成功构建。
  • 我想简要更新一下这个问题,因为它引起了很多关注 - 这是在比当前可用的版本更旧的 EF Core 上构建的,在遇到其他几个问题之后,我们结束了解决方案继续使用 EF6,直到 Core 有更多时间安定下来。甚至 EF6 也存在问题,但我们的设置要可靠得多。

标签: c# entity-framework-core


【解决方案1】:

两个最重要的提示:

[1] - 在运行新的脚手架命令之前,确保您的项目完全构建。

否则……

  • 您将开始编写一行代码。
  • 您会发现模型中缺少必需的 DB 列。
  • 你会去尝试搭建它。
  • 20 分钟后,您会意识到构建(和脚手架命令)失败的原因是因为您实际上只写了半行代码。糟糕!

[2] - 检查源代码管理或制作副本:

  • 让您可以轻松验证更改的内容。
  • 如果需要允许回滚。

如果你运气不好或犯了错误,你可能会遇到一些非常烦人的“鸡和蛋”问题。


其他问题:

如果您有多个 DLL,请确保您没有生成到错误的项目。出现“构建失败”消息的原因有很多,但最愚蠢的情况是在要搭建脚手架的项目中没有安装 EFCore。

在包管理器控制台中有一个 Default project 下拉菜单,如果您错过了预期的更改,这可能是您的新文件结束的地方。

比记住设置下拉菜单更好的解决方案是将-Project 开关添加到您的脚手架命令中。

这是我使用的完整命令:

对于 EF Core 2

Scaffold-DbContext -Connection “服务器=(本地);数据库=DefenderRRCart;集成 安全=真;Trusted_Connection=真;”-提供者 Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

对于 EF Core 3

dotnet ef dbcontext 脚手架 "服务器=tcp:XXXXX.database.windows.net,1433;初始 目录=DATABASE_NAME;持久安全信息=False;用户 ID=用户名;密码=密码;MultipleActiveResultSets=假;加密=真;TrustServerCertificate=假;连接 超时 = 30;" Microsoft.EntityFrameworkCore.SqlServer -o DB.Models --context-dir DB.Contexts --context RRDBContext --project RR.EF.csproj --force --use-database-names

注意:-force 将覆盖文件,但不会删除不再存在的文件。如果您从数据库中删除表,您必须自己删除旧的实体文件(只需在资源管理器中按日期排序并删除旧的)。


完整的脚手架参考:

EF 核心 2:

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

EF 核心 3:

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

【讨论】:

  • 还要确保 Project.JSON 文件中没有 cmets
  • 是的,如果您希望将数据访问逻辑放在单独的文件中,您可以将其构建为“类库”项目,但主要项目需要是 aspnet 核心项目
  • 如果您删除了实体文件,您会怎么做?脚手架将不起作用,因为您缺少此文件,但它不会脚手架,因为它没有构建。很烦人。
  • 令人讨厌的是,您似乎需要能够构建整个解决方案。我在其他项目中遇到了错误,但脚手架的项目很好。解决方案是选择其他项目并“卸载”它们。然后脚手架,然后重新加载。
  • --> 确保您的项目完全构建
【解决方案2】:

Ctrl+Shift+B 手动构建项目帮助我查看导致构建失败的错误。

【讨论】:

  • 正如几年前已经接受的答案一样。 “在运行新的脚手架命令之前,请确保您的项目已完全构建。”
  • 这对我来说并没有揭示问题。 Visual Studio 继续成功构建,即使在清理之后也是如此。将 --verbose 标志添加到 dotnet ef scaffold 没有帮助。我必须做一个dotnet build 才能看到错误。
  • 非常感谢!输入 Ctrl + Shift + B 在 VS 中显示了我所有的构建错误并节省了我的时间。
【解决方案3】:

我知道这是旧的,但我今天花了一段时间试图弄清楚这一点,所以我希望这对某人有所帮助。

我有一个 .Net Core 项目,但我想将我的文件搭建到 .Net Standard 类库中。包管理器控制台中的DbContext-Scaffold 对我不起作用,但常规命令提示符中的dotnet ef dbcontext scaffold 可以。

我必须在我的类库中安装这些包:

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

我必须在我的解决方案中将 .Net Core 项目设置为启动项目并且该项目必须引用我的类库。我认为最后一部分是我错过的,这让我一直摸不着头脑。

最后,我从命令提示符 cd 进入类库并运行:

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

【讨论】:

    【解决方案4】:

    即使我确保我的项目(安装了 EF Core)正确构建,我仍然遇到这个问题。它仍然因“构建失败”而失败。消息,在使用-Verbsose 标志时可见。

    我必须这样做:

    • 创建一次性 ASP.NET Core Web 应用程序解决方案
    • 将 EF Core NuGet 包添加到解决方案中
    • 添加 EF Core Sql Server 提供程序 NuGet 包(因为我使用的是 SqlServer)
    • 添加 EF Core Tools NuGet 包
    • 在包管理器控制台命令中切换 -Project 以指向我新创建的(和 EF Core 配置的)项目。最后一步只是为了衡量,因为我的一次性解决方案中只有一个项目。

    整个过程似乎需要在解决方案的某个地方有一个 ASP.NET Core 项目(或者只是一个不是类库的 .NET Core 项目),大概也设置为解决方案启动项目。

    【讨论】:

    • 这可能是此页面上更有用的条目之一。 -verbose 标志应该朝着正确的方向推进,因为它涵盖了脚手架可能出错的许多事情。
    【解决方案5】:

    确保您的项目没有运行,由于某种原因,当我的 API 在后台运行时,此命令不起作用。

    【讨论】:

      【解决方案6】:

      使用 VS2017 Preview 3、.NET Core 2 (PREVIEW) 我遇到了各种各样的问题,但最终我采用了上面建议的方法并创建了一个全新的解决方案。

      1. 创建了新的 .NET Core 解决方案
      2. 编辑项目文件并将 1.0 更改为 2.0: &lt;TargetFramework&gt;netcoreapp2.0&lt;/TargetFramework&gt;
      3. 关闭/重新打开的解决方案

      然后,添加实体框架:

      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. 编辑项目文件,并添加: &lt;DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" /&gt;

      那么;

      1. 打开 Powershell 命令提示符并将目录更改为 Scaffold 项目文件夹
      2. 跑:dotnet ef dbcontext 脚手架 “服务器=DESKTOP-MB70B7U;数据库=ForexForme; Trusted_Connection=True" Microsoft.EntityFrameworkCore.SqlServer -o 楷模
        • 您将自己的连接字符串放在哪里!
        • Models 是我放置所有类的目录的名称

      【讨论】:

        【解决方案7】:

        构建完整的解决方案并查看失败的地方。我有一些 NuGet 项目隐藏在一个未构建的文件夹中。只有在重建解决方案时,我才发现问题所在。一切都需要构建,否则 Scaffold 将失败。

        【讨论】:

        • 这对我来说并没有揭示问题。 Visual Studio 继续成功构建,即使在清理之后也是如此。将 --verbose 标志添加到 dotnet ef scaffold 没有帮助。我必须做一个dotnet build 才能看到错误。
        【解决方案8】:

        如果您在解决方案中使用多个项目,请在包管理器中检查默认项目。

        【讨论】:

          【解决方案9】:

          多亏了上述,重建项目解决方案解决了这个问题。对我个人来说,一些重要的警告是:

          1. 运行 dotnet build 是不够的(我以为是这样)!
          2. 在 Visual Studio 菜单中,构建 > 构建解决方案(Ctrl + Shift + B)
            • 我相信我只是想在子项目 (myProject.data) 中运行 dotnet build 命令
            • 重建父项目 (myProject) 解决方案是关键

          希望对同样困惑的人有所帮助!

          【讨论】:

            【解决方案10】:

            我通过右键单击项目解决了这个问题,“卸载项目”只允许 EF 项目并运行命令

            【讨论】:

              【解决方案11】:

              对我来说,问题是我试图在解决方案内部的一个新的空白控制台项目中设置它,该项目没有文件,因此脚手架试图将此项目用作启动项目,但找不到 @ 987654321@。我通过添加一个带有空主文件的新文件来修复它

              【讨论】:

                【解决方案12】:

                如果 entity-framework 返回 build failed,很可能您的任何项目中都有某种错误。

                即使您正在运行命令的项目是干净且无错误的,该解决方案中的其他项目也可能导致 build failed 响应。

                解决方案

                • 重建整个解决方案。您很可能会在解决方案重建过程中发现该错误。
                • 确保在Default project 下拉列表中Package Manager Console 中选择了要运行命令的项目
                • 重新运行命令。

                【讨论】:

                  【解决方案13】:

                  我有同样的构建失败错误...

                  我在关闭 Visual Studio 并再次打开它之后,在此 Scaffold-Dbcontext 构建成功后从构建菜单运行 Clean SolutionRebuild Solution

                  【讨论】:

                    【解决方案14】:

                    对我来说,我的项目是在 Visual Studio 中构建的,但在运行 Scaffold-DbContext 时我必须为“Microsoft.AspNetCore.App”指定一个版本。

                    所以代替:

                    <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>
                    

                    【讨论】:

                      【解决方案15】:

                      确保您的构建工作正常。
                      从包控制台运行脚手架命令,您的命令应该可以工作:

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

                      【讨论】:

                        【解决方案16】:

                        我通过停止我的服务器然后再次运行它来解决它。

                        【讨论】:

                          【解决方案17】:

                          今天这对我不起作用。所以我尝试从命令行运行 dotnet scaffold 命令,它第一次工作。别问我!!

                          【讨论】:

                          • 在我发现 --verbose 标志之前它又坏了,它提供了堆栈跟踪,使我能够识别问题。如果与此标志无关地输出错误可能会有所帮助。
                          【解决方案18】:

                          我有一个问题,我的 DbContext 项目(接口的部分类)中有一些依赖于生成文件的非脚手架代码。不过,作为重新脚手架的一部分,我删除了所有以前生成的代码,这当然会导致项目无法构建并因此无法搭建脚手架。

                          我的解决方法是在项目上进行自定义“脚手架”配置,该配置只是从编译中删除任何代码生成相关文件所在的整个子文件夹。

                          如果这是适合您的路径,请编辑您的 DbContext 的 .csproj 并添加:

                          <ItemGroup Condition="'$(Configuration)' == 'Scaffold'">
                              <Compile Remove="NonGenerated\**\*.*" />
                          </ItemGroup>
                          

                          并更改您的命令行以包含--configuration Scaffold 参数。我如何执行此操作的 powershell 示例如下:

                          # Run from DbContext project root
                          $DbContextProjName = "Engine.Common.Dal"
                          #conStr = "...." #Your ConnectionString here, or loaded otherwise
                          if (Test-Path "Generated"){
                              Remove-Item -Recurse -Force "Generated"
                          }
                          
                          #Entities/Context in own folder for easy delete then regen, entity-dependant files go in NonGenerated
                          dotnet ef dbcontext scaffold `
                              $conStr `
                              "Microsoft.EntityFrameworkCore.SqlServer" `
                              --context DatabaseContext `
                              --data-annotations --force --no-onconfiguring `
                              --namespace "$($DbContextProjName)" `
                              --output-dir "Generated" `
                              --project "$($DbContextProjName).csproj" `
                              --startup-project "$($DbContextProjName).csproj" `
                              --configuration "Scaffold"
                          if (! $?){
                              throw "dotnet ef scaffold failed!"
                          }
                          

                          【讨论】:

                            【解决方案19】:

                            确保您拥有所有软件包并按 ctrl + shift +b 构建解决方案。它对我有用。

                            【讨论】:

                            • 正如几年前已经接受的答案一样。 “在运行新的脚手架命令之前,请确保您的项目已完全构建。”
                            【解决方案20】:
                            1. 确保您的项目没有运行
                            2. 确保您的项目正在编译

                            这对我有用。

                            【讨论】:

                              【解决方案21】:

                              1-

                              确保构建成功,检查构建是否成功转到解决方案资源管理器并右键单击解决方案名称并重新构建解决方案,所有项目都将构建成功并且一切顺利。

                              2-

                              安装 NuGet 包 Microsoft.EntityFrameworkCore.SqlServer

                              安装 NuGet 包 Microsoft.EntityFrameworkCore.Tools

                              安装 NuGet 包 Microsoft.EntityFrameworkCore.Design

                              如果您遵循洋葱架构,请检查 NuGet 包(如 (3.1.3))的所有版本是否相同,并安装在类库中。

                              3-

                              如果仍然存在,请立即尝试,检查 db 上下文失败,应在 asp.net 核心 Web 项目中添加对类库的引用。

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2018-06-05
                                • 1970-01-01
                                • 2019-05-08
                                • 2020-09-22
                                • 1970-01-01
                                • 2019-04-28
                                • 2018-03-06
                                • 2019-02-10
                                相关资源
                                最近更新 更多