在数据库First Scaffold-DbContext上“构建失败”


81

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


6
重新编译整个解决方案时,您会收到任何错误/警告吗?
伊格纳斯,2016年

@Ignas做到了,是的,在重新编译之前,我遇到了不存在的依赖项错误,而该错误本不应该存在。我没有尝试与之抗争,而是重新制定了解决方案。我现在有一个新问题。猜猜我应该过一会儿再问一个新问题(如果这个问题很相似),而不是编辑这个问题。
LightToTheEnd

认为您的问题是,必须具有project.json才能声明EFC工具。尝试以正确的项目类型重写,这可能会生成json。
Webezine

1
对我来说,起作用的是在发出脚手架命令之前确保整个解决方案(不仅仅是项目)成功构建。
manish gupta

我想简要地更新这个问题,因为它引起了很多关注-这是在比目前可用的版本更老的EF Core上构建的,在遇到其他几个问题之后,我们最终采用的解决方案是EF6,直到Core更多的时间来解决。甚至EF6都存在问题,但我们可以更可靠地进行设置。
LightToTheEnd

Answers:


152

两个最重要的提示:

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

除此以外...

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

[2]-签入源代码管理或进行复制:

  • 使您可以轻松地验证更改了什么。
  • 如果需要,可以回滚。

如果您不幸或犯了一个错误,可能会遇到一些非常烦人的“鸡肉和鸡蛋”问题。


其他问题:

如果您有多个DLL,请确保没有生成错误的项目。可能由于多种原因而出现“ Build failed”消息,但最愚蠢的情况是,如果您在脚手架上的项目中未安装EFCore,则该消息是最愚蠢的。

在程序包管理器控制台中,有一个Default project下拉列表,如果您缺少预期的更改,则可能是新文件最终存放的位置。

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

这是我使用的完整命令:

对于EF Core 2

“脚手架-DbContext-连接”服务器=(本地);数据库= DefenderRRCart;集成安全性= True; Trusted_Connection = True;“ -提供者Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models-上下文RRStoreContext-项目RR.DataAccess -force

对于EF Core 3

dotnet ef dbcontext支架“ Server = tcp:XXXXX.database.windows.net,1433;初始目录= DATABASE_NAME;持久安全信息= False;用户ID = USERNAME;密码= PASSWORD; MultipleActiveResultSets = False;加密= True; TrustServerCertificate = False ;连接超时= 30;“ Microsoft.EntityFrameworkCore.SqlServer -o DB.Models --context-dir DB.Contexts --context RRDBContext-项目RR.EF.csproj --force --use-database-names

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


完整的脚手架参考:

EF核心2:

https://docs.efproject.net/zh_CN/latest/miscellaneous/cli/powershell.html#scaffold-dbcontext(此

EF核心3:

https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/dotnet


还请确保Project.JSON文件中没有注释
Simon_Weaver

是的,如果您希望将数据访问逻辑放在一个单独的文件中,则可以将其放入“类库”项目中,但是主要项目必须是一个aspnet核心项目
Simon_Weaver

提示:确保从程序包管理器控制台运行。从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手动构建项目可以帮助我查看导致构建失败的错误。


是的,编译解决方案也对我有帮助。
Piero Alberto

正如公认的答案已经在几年前说过了。“在运行新的脚手架命令之前,请确保您的项目完全构建。”
格特·阿诺德


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核心项目(或者只是一个不是类库的.NET Core项目),大概也被设置为解决方案启动项目。


1
这可能是此页面上更有用的条目之一。-verbose标志应该向正确的方向推动,因为它涵盖了许多可能会导致支架出错的问题。
Regianni

4

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

  1. 创建了新的.NET Core解决方案
  2. 编辑项目文件并将1.0更改为2.0: <TargetFramework>netcoreapp2.0</TargetFramework>
  3. 封闭/重新开放的解决方案

然后,添加实体框架:

  1. 在PackageManager控制台中:
    • 安装软件包Microsoft.EntityFrameworkCore.SqlServer-版本2.0.0-preview2-final
    • 安装软件包Microsoft.EntityFrameworkCore.Tools-版本2.0.0-preview2-final
    • 安装软件包Microsoft.EntityFrameworkCore.Design-版本2.0.0-preview2-final
  2. 编辑了项目文件,并添加了: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

然后;

  1. 打开Powershell命令提示符,并将目录更改为Scaffold项目文件夹
  2. 冉:dotnet ef dbcontext支架“ Server = DESKTOP-MB70B7U; Database = ForexForme; Trusted_Connection = True” Microsoft.EntityFrameworkCore.SqlServer -o模型
    • 您在其中放置自己的连接字符串的地方!
    • 模型是我将所有类放入目录的名称

4

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


3

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


3

由于以上原因,重建项目解决方案可以解决此问题。对我个人而言,一些重要的警告是:

  1. 运行该命令dotnet build还不够(我假设是)!
  2. 在Visual Studio菜单中,选择“构建”>“构建解决方案”(Ctrl + Shift + B)
    • 我相信我只是dotnet build在子项目(myProject.data)中尝试运行命令
    • 重建父项目(myProject)解决方案是关键

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



2

我通过右键单击项目来解决它,“卸载项目”仅让EF项目运行命令


1

如果实体框架返回build failed,则很可能您的任何项目中都有某种错误。

即使您正在运行命令的项目是干净的并且没有错误,该解决方案中的其他项目也会引起build failed响应。

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

1

对我来说,我的项目是在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>

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标志之前,它再次中断,该标志传递了stacktrace,使我能够确定问题所在。如果错误输出与该标志无关,可能会有所帮助。
Regianni


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.