繁体   English   中英

Database First Scaffold-DbContext 上的“构建失败”

[英]"Build failed" on Database 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] - 在运行新的脚手架命令之前,确保您的项目完全构建。

否则...

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

[2] - 签入源代码管理或制作副本:

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

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


其他问题:

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

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

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

这是我使用的完整命令:

对于 EF 核心 2

Scaffold-DbContext -Connection "Server=(local);Database=DefenderRRCart;Integrated Security=True;Trusted_Connection=True;" -Provider Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

对于 EF 核心 3

dotnet ef dbcontext scaffold "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 ;连接超时=30;" Microsoft.EntityFrameworkCore.SqlServer -o DB.Models --context-dir DB.Contexts --context RRDBContext --project RR.EF.csproj --force --use-database-names

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


完整的脚手架参考:

英孚核心 2:

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

英孚核心 3:

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

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

我知道这很旧,但我今天花了一段时间试图解决这个问题,所以我希望这对某人有所帮助。

我有一个 .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>

即使我确保我的项目(安装了 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 核心项目),大概也设置为解决方案启动项目。

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

使用 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 -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
    • 您放入自己的连接字符串的位置!
    • 模型是我放置所有类的目录的名称

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

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

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

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

我希望能帮助同样困惑的其他人!

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

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

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

解决方案

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

我通过右键单击项目和“卸载项目”解决了它,只让 EF 项目并运行命令

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

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

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

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

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

我有一个问题,我的 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!"
}

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

我关闭visual studio并再次打开它,在此Scaffold-Dbcontext构建成功后运行Clean Solution ,然后从Build Menus Rebuild Solution

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

  1. 确保您的项目没有运行
  2. 确保您的项目正在编译

那对我有用。

1-

确保构建成功,要检查构建是否成功,请转到解决方案资源管理器并右键单击解决方案名称并重新构建解决方案,所有项目都将成功构建并运行良好。

2-

安装 NuGet 包 Microsoft.EntityFrameworkCore.SqlServer

安装 NuGet 包 Microsoft.EntityFrameworkCore.Tools

安装 NuGet 包 Microsoft.EntityFrameworkCore.Design

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

3-

现在尝试,如果仍然检查数据库上下文失败,应该在 asp.net core web 项目中添加对类库的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM