您的启动项目没有引用Microsoft.EntityFrameworkCore.Design

el_*_*_le 6 c# visual-studio nuget entity-framework-core

我的解决方案中有2个项目,有一个安装了Entity Framework Core的项目:

在此处输入图片说明

在另一个ASP.NET Web API项目中,我具有以下软件包:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.5.0.2" targetFramework="net461" />
  <package id="Microsoft.ApplicationInsights" version="2.5.1" targetFramework="net461" />
  <package id="Microsoft.ApplicationInsights.Agent.Intercept" version="2.4.0" targetFramework="net461" />
  <package id="Microsoft.ApplicationInsights.DependencyCollector" version="2.5.1" targetFramework="net461" />
  <package id="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.5.1" targetFramework="net461" />
  <package id="Microsoft.ApplicationInsights.Web" version="2.5.1" targetFramework="net461" />
  <package id="Microsoft.ApplicationInsights.WindowsServer" version="2.5.1" targetFramework="net461" />
  <package id="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.5.1" targetFramework="net461" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.4" targetFramework="net461" />
  <package id="Microsoft.AspNet.Razor" version="3.2.4" targetFramework="net461" />
  <package id="Microsoft.AspNet.TelemetryCorrelation" version="1.0.0" targetFramework="net461" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.4" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.4" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.4" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.4" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.4" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.4" targetFramework="net461" />
  <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="2.0.0" targetFramework="net461" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net461" />
  <package id="Newtonsoft.Json" version="11.0.1" targetFramework="net461" />
  <package id="System.Diagnostics.DiagnosticSource" version="4.4.1" targetFramework="net461" />
  <package id="WebGrease" version="1.6.0" targetFramework="net461" />
</packages>
Run Code Online (Sandbox Code Playgroud)

当我Add-Migration在PMC中运行时:

您的启动项目“ API”未引用Microsoft.EntityFrameworkCore.Design。该软件包是实体框架核心工具运行所必需的。确保您的启动项目正确,安装软件包,然后重试。

我在启动项目中而不是将包含所有实体的数据项目中安装了Microsoft.EntityFrameworkCore.Design,现在它可以工作了,这是应该如何设置项目?

ast*_*ker 65

我在这里找到了解决方案。

简而言之,编辑您的 csproj 文件,并将PropertyGroup以下条目添加到您的部分:

<GenerateRuntimeConfigurationFiles>True</GenerateRuntimeConfigurationFiles>
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用。请注意,如果您有多个项目,则应将其放置在您引用实体框架的项目中。您可能需要从某些包引用中删除 ```&lt;PrivateAssets&gt;all&lt;/PrivateAssets&gt;``` (我从 ```&lt;PackageReference Include="Microsoft.EntityFrameworkCore.Design"``` 和 ```&lt;PackageReference 中删除包括=“Microsoft.EntityFrameworkCore.Tools”``` (27认同)
  • 感谢@RenatoMedeiros,从设计项目中删除 PrivateAsserts = all 解决了这个问题。我什至不需要GenerateRuntimeConfigurationFiles 设置! (7认同)

thu*_*hus 35

没有一个选项对我有用。但是我在这个主题上尝试过的一个工作: EF Core 3 design time migrations breaked by Microsoft.EntityFrameworkCore.Design DevelopmentDependency

在将包导入到 Data 项目后,我刚刚注释掉了以下内容:

<ItemGroup>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.5">
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  <!--<PrivateAssets>all</PrivateAssets>-->
</PackageReference>
Run Code Online (Sandbox Code Playgroud)

非常感谢 Microsoft 每次发布新的 .NetCore 更新时都会破坏现有项目!

  • 我将“全部”替换为“无”,我认为这是更合适的,但答案帮助我找到了解决方案,谢谢!对于想要进一步研究 PrivateAssets 工作原理的人来说,以下是一些更多信息:https://learn.microsoft.com/en-us/dotnet/core/tools/csproj (3认同)

viv*_*una 25

你有多个项目吗?如果是,那么您必须将宿主项目作为解决方案资源管理器中的启动项目,并将该项目设置为 PMC 中的默认项目(哪个项目具有 DBContext)。然后运行Add-Migration命令。


小智 24

“您的‘项目名称’不是指您的启动项目 Microsoft.EntityFrameworkCore.Design。此包是 Entity Framework Core Tools 工作所必需的。请确保您的启动项目正确,安装该包并重试。”

如果您收到此错误,请在您的项目中尝试“构建 > 清理解决方案”,然后再次尝试运行您的命令。

这在我的项目中有效。或者您可能想查看文档

我在我的项目中使用 .Net Core 3.1 版本。

  • 再次强调,这样做并不是解决问题的办法。它最终只是将 EF 程序集添加到启动项目中,该项目应该与基础设施完全分离(关注点分离)。[这是正确的答案](/sf/answers/4386474291/),它将删除基础设施程序集“.csproj”文件中的“&lt;PrivateAssets&gt;all&lt;/PrivateAssets&gt;”。 (4认同)
  • 我没有做其他答案中提到的任何事情,只是清理解决方案,主要项目正在使用 .net core 3.1。这对我有用。 (2认同)

小智 20

请确保您已安装以下软件包。我也遇到了同样的错误并安装在包下面,它对我有用。

Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Tools
Run Code Online (Sandbox Code Playgroud)

  • 再次强调,这样做并不是解决问题的办法。它最终只是将 EF 程序集添加到启动项目中,该项目应该与基础设施完全分离(关注点分离)。[这是正确的答案](/sf/answers/4386474291/),它将删除基础设施程序集“.csproj”文件中的“&lt;PrivateAssets&gt;all&lt;/PrivateAssets&gt;”。 (4认同)
  • 谢谢,这对我有用:“dotnet add package Microsoft.EntityFrameworkCore.Design”源https://learn.microsoft.com/en-us/ef/core/get-started/install/ (3认同)

And*_*nov 11

绝对没有理由在拥有单独的数据项目的同时将 Microsoft.EntityFrameworkCore.Design 安装到您的 API 项目中。

快速解决方案

使用 add-migration 时,只需添加一个参数即可将 -StartUpProject 设置为您的 Data proj(默认情况下,我假设您的启动项目是 API proj)。


下面的添加迁移命令示例:

add-migration {migration_name} -StartUpProject {your_data_proj_name} -project {your_data_proj_name} -v
Run Code Online (Sandbox Code Playgroud)

下面的示例更新数据库命令:

update-database -StartUpProject {your_data_proj_name} -project {your_data_proj_name} -v
Run Code Online (Sandbox Code Playgroud)

我希望这对你们有帮助

PS:有关添加迁移参数的更多信息可以在这里找到


noe*_*cus 9

我收到此错误是因为 Visual Studio 默认使用实体框架核心而不是旧式实体框架用于 .NET 框架:实体框架 6。这是我的解决方案:

EntityFramework\Update-Database
Run Code Online (Sandbox Code Playgroud)

或者明确引用版本:

EntityFramework6\Update-Database
Run Code Online (Sandbox Code Playgroud)

同样值得检查在包管理器控制台中选择了正确的项目。那个喜欢偷偷溜回其他项目的一半时间!

  • 我只想补充一下,如果您使用 EF 6,正确的命令是:`EntityFramework6\Add-Migration`,它可以为我解决问题。谢谢。 (2认同)

小智 7

您可以使用以下命令解决此问题

dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design
Run Code Online (Sandbox Code Playgroud)

  • 添加包无助于保持 EF 程序集独立,这完全有可能是因为在“csproj”中使用“&lt;PrivateAssets&gt;all&lt;/PrivateAssets&gt;”隐藏了程序集,使其无法被启动项目访问。 (2认同)

小智 6

当我删除.csproj 中的私有资产

EFCore.设计

不让私有资产属性全部通过包的属性


小智 5

尝试再次将您的 Web 项目设置为启动项目,此警告应该消失。(右键单击 web 项目 > 设置为启动项目)


小智 5

如果您想在不向服务中添加 EF 引用的情况下进行迁移,则具有数据访问权限的库需要一种构建 DbContext 实例的方法。您可以通过实现 IDesignTimeDbContextFactory 来做到这一点,例如:

public class MyContextFactory : IDesignTimeDbContextFactory<MyContext>
{
    public MyContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
        optionsBuilder.UseSqlServer("Data Source=MyDatabase");

        return new MyContext(optionsBuilder.Options);
    }
}
Run Code Online (Sandbox Code Playgroud)