EntityFrameworkCore 2.x和PrivateAsset =“All”

时间:2017-06-21 15:09:55

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

我正在构建一个.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抛出异常:&gt; System.IO.FileNotFoundException:无法加载文件或程序集'Microsoft.EntityFrameworkCore,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = adb9793829ddae60'。系统找不到指定的文件。

这没有任何意义。大会就在那里。所以我似乎无法让两个应用程序同时工作。这些错误对我没有意义。关于包的PrivateAsset =“All”功能似乎没有什么信息。我找到了这个描述:

提示 私有包引用(PrivateAssets =“All”)表示此依赖项是当前项目的本地依赖项。例如,如果项目A具有仅构建依赖项且项目B依赖于A,则dotnet还原不会将A的仅构建依赖项添加到项目B中。

参考 .Net Command Line Tools

如何解决这个问题?弄清楚为什么webapi停止工作(未找到方法)或调试缺少的程序集引用,而不是从我所知道的,丢失的?

所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

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

有关PrivateAssets的信息,请参阅the documentation。添加PrivateAssets="All"会阻止您的数据图层的依赖关系传播到您的应用中。因此,您得到无法加载程序集错误。