【问题标题】:EntityFrameworkCore 2.x and PrivateAsset="All"EntityFrameworkCore 2.x 和 PrivateAsset="All"
【发布时间】:2017-06-22 23:52:00
【问题描述】:

我正在构建一个.NetCoreApp1.1 webapi。我们分解了典型的业务和数据层组件。当我们将EntityFrameworkCore 2.x 添加到数据访问项目时,我能够测试跨项目的功能。但是 webapi 停止工作了!我们不再能够启动该应用程序。 program.cs-main 失败并出现异常:

System.MissingMethodException:“找不到方法:'System.IServiceProvider >MicrosoftExtensions.DependencyInjection.ServiceCollectionContainerBuilderExtens>ions.BuildServiceProvider...'

文章指出包裹类型不匹配,但我找不到任何不合适的地方。数据层中的 EntityFrameworkcore 是可疑的,因为它是 2.0.0-preview1-final 版本。在VS2017 中有一个新功能可以将包标记为程序集的私有。在数据层中使用 EF 执行此操作很有意义,因此我打开了项目并将它们标记为 PrivateAsset="All"

   <ItemGroup>
      <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0-preview1-final" **PrivateAssets="All"** />
      <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0-preview1-final" PrivateAssets="All" />
      <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0-preview1-final" PrivateAssets="All" />
      <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="2.0.0-preview1-final" PrivateAssets="All" />
      <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0-preview1-final" PrivateAssets="All" />
      <PackageReference Include="WindowsAzure.Storage" Version="8.1.4" />
    </ItemGroup>

这解决了我的问题。我能够重建并运行 webapi 应用程序。 但是,现在我的测试失败了:

消息:测试方法 ACMEAppTests.AppTests_FileManagerSave.FileManager_SaveFile 抛出异常:>System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.EntityFrameworkCore,版本=2.0.0.0,文化=中性,PublicKeyToken=adb9793829ddae60”。系统找不到指定的文件。

这毫无意义。大会在那里。所以看来我不能让两个应用程序同时工作。这些错误对我来说毫无意义。关于包的 PrivateAsset="All" 功能的信息似乎很少。我找到了这个描述:

提示 私有包引用 (PrivateAssets="All") 意味着此依赖项对于当前项目是本地的。例如,如果项目 A 具有仅构建依赖项,而项目 B 依赖于 A,则 dotnet restore 不会将 A 的仅构建依赖项添加到项目 B 中。

参考 .Net Command Line Tools

如何解决这个问题?找出 webapi 停止工作的原因(找不到方法)或调试缺少的程序集引用,据我所知,它没有丢失?

感谢所有帮助。

【问题讨论】:

    标签: asp.net-core entity-framework-core asp.net-core-webapi


    【解决方案1】:

    您不能将 ASP.NET Core 1.1 与 EF Core 2.0 混合使用。它们共享一些常见的依赖项(例如 Logging、DependencyInjection 等),这意味着您的所有 Microsoft.* 包版本都需要或多或少对齐。

    请参阅 the documentation 关于 PrivateAssets。添加PrivateAssets="All" 可防止数据层的依赖项传播到您的应用程序中。因此,您会收到 could not load assembly 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 2018-10-10
      相关资源
      最近更新 更多