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

时间:2016-08-15 18:49:35

标签: c# entity-framework-core

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

19 个答案:

答案 0 :(得分:85)

首先确保在运行新的脚手架命令之前构建项目。

经常发生在我身上的是我将开始编写一行代码,需要实现一个新的DB列,然后尝试搭建它 - 然后在20分钟后实现我的构建(和脚手架命令)失败的原因是因为我有一半写的代码。糟糕。

如果您有多个DLL,则可能会生成错误的项目。然后由于多种原因发生'构建失败',很可能是因为您没有在该项目中安装EFCore。

在软件包管理器控制台中有一个Default project,这可能就是文件结束的地方。

解决方案很简单,只需将-Project开关添加到您的选项中即可。

这是我使用的完整命令:

  

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

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

完整选项:https://docs.efproject.net/en/latest/miscellaneous/cli/powershell.html#scaffold-dbcontext

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

  1. 创建新的.NET Core解决方案
  2. 编辑项目文件并将1.0更改为2.0:    <TargetFramework>netcoreapp2.0</TargetFramework>
  3. 已关闭/重新开启的解决方案
  4. 然后,添加了实体框架:

    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" />
    3. 然后;

      1. 打开Powershell命令提示符并将目录更改为Scaffold 项目文件夹
      2. Ran:dotnet ef dbcontext scaffold “Server = DESKTOP-MB70B7U; Database = ForexForme; Trusted_Connection = True“Microsoft.EntityFrameworkCore.SqlServer -o 楷模
        • 您放入自己的连接字符串的位置!
        • Models是我放置所有类的目录的名称

答案 4 :(得分:2)

对我来说,问题是我试图将其设置在解决方案内部的一个新的空白控制台项目中,该项目没有文件,因此脚手架试图将此项目用作启动项目而且无法使用找Main。我通过添加一个空主

的新文件来修复它

答案 5 :(得分:2)

手动构建项目 Ctrl + Shift + B 可以帮助我了解导致构建失败的错误。

答案 6 :(得分:1)

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

我必须这样做:

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

今天停止为我工作了。因此,我尝试从命令行运行dotnet scaffold命令,并且该命令第一次起作用。不要问我!!

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

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

  1. 仅凭dotnet build运行dotnet build即可!
  2. 在Visual Studio菜单中, Build> Build solution (Ctrl + Shift + B)
    • 我相信我只是在子项目(myProject.data)中尝试运行find "$PWD" -type f -name "*.in" 命令
    • 重建父项目(myProject)解决方案是关键

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

答案 14 :(得分:0)

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

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

解决方案

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

答案 15 :(得分:0)

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

答案 16 :(得分:-1)

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

答案 17 :(得分:-1)

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

对我有用。

答案 18 :(得分:-1)

1-

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

2-

安装 NuGet 包 Microsoft.EntityFrameworkCore.SqlServer

安装 NuGet 包 Microsoft.EntityFrameworkCore.Tools

安装 NuGet 包 Microsoft.EntityFrameworkCore.Design

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

3-

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