无法加载 DLL 'sni.dll' - 实体框架核心

Posted

技术标签:

【中文标题】无法加载 DLL \'sni.dll\' - 实体框架核心【英文标题】:Unable to load DLL 'sni.dll' - Entity Framework Core无法加载 DLL 'sni.dll' - 实体框架核心 【发布时间】:2017-07-28 21:59:33 【问题描述】:

在 Visual Studio 2017 上的 ASP.Net Core 应用程序中使用 Entity Framework Core 时,我间歇性地收到错误“无法加载 'sni.dll'。

奇怪的是,我找到了一个临时解决方法:重新启动我的电脑。

我不知道为什么错误不断发生,我不知道变量可能是什么。任何人都可以阐明可能的原因吗?我会提供完整的堆栈跟踪,但自从决定在这里发帖以来就没有发生过,下次发生时我一定会更新它。我肯定知道(因为调试捕获了异常)当 EF 有理由从数据库获取数据并转换为实体时会发生这种情况。

提前感谢您的任何建议。

--编辑 这仍在发生。设法记住捕获堆栈跟踪:

发生 System.DllNotFoundException H结果=0x80131524 消息=无法加载 DLL 'sni.dll':指定的网络名称不再可用。 (来自 HRESULT 的异常:0x80070040) 来源= 堆栈跟踪: 在 System.Data.SqlClient.SNINativeMethodWrapper.UnmanagedIsTokenRestricted(IntPtr 令牌,Boolean& isRestricted) 在 System.Data.Win32NativeMethods.IsTokenRestrictedWrapper(IntPtr 令牌) 在 System.Data.ProviderBase.DbConnectionPoolIdentity.GetCurrent() 在 System.Data.ProviderBase.DbConnectionPoolGroup.GetConnectionPool(DbConnectionFactory 连接工厂) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnectionPool(DbConnection owningObject,DbConnectionPoolGroup connectionPoolGroup) 在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource1 重试,DbConnectionOptions userOptions) 在 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.Open() at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open() at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable.Enumerator.BufferlessMoveNext(Boolean buffer) at Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](Func2 操作,Func2 verifySucceeded, TState state) at Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.<_ShapedQuery>d__31.MoveNext() 在 Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.<_include>d__301.MoveNext() at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable1 来源) 在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler。c__DisplayClass20_01.<CompileQueryCore>b__0(QueryContext qc) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 源)

【问题讨论】:

【参考方案1】:

添加 nuget 包 System.Data.SqlClient v4.4.0 为我解决了同样的问题。该问题并非特定于实体框架。这是由于旧版本的 SqlClient 依赖于 dotnet Core 2 中不可用的 API。

【讨论】:

完美。是的,这似乎奏效了。由于它的间歇性,我不能肯定地说,只有时间会告诉我猜。但我会将此答案标记为正确。感谢您的帮助。 就我而言,这是更新 System.Data.SqlClient 的 NuGet 包的问题。我不会根据错误猜到它。谢谢!【参考方案2】:

在某些情况下,此问题可能是由于 IIS 没有足够的权限来访问您的 %USERPROFILE%.nuget 的区域

这可以通过以下两种简单方法之一解决:

向 IIS appPool(如 DefaultAppPool 或 FooAppPool)授予权限,使其不仅可以访问 .Nuget 文件夹(这通常是自动完成的)。

将正在使用的 AppPool 设置为 Identity 下的“LocalSystem”运行,这样 appPool 将被视为具有更高的权限并且应该具有访问权限。

以下是其他用户在几年前“解决”时遇到此错误的一系列参考:

https://github.com/Azure/app-service-announcements-discussions/issues/9
https://github.com/dotnet/cli/issues/5262
https://github.com/dotnet/corefx/issues/5252
https://github.com/dotnet/corefx/issues/30518

所有这些都引用了 SQLClient 的版本(虽然这是相关的,但这是一个遗留问题),但一位聪明的人 @azisoft (this link) 意识到了这一点,并为此提供了很多帮助。

【讨论】:

【参考方案3】:

对于 Entity Framework Core 3.x,安装 Microsoft.Data.SqlClient Nuget 包而不是 System.Data.SqlClient。

【讨论】:

我遇到了同样的错误,我安装了 Microsoft.Data.SqlClient 包。 @JonathanWood 您是否尝试过将它(可能还有 EF Core 包?)安装到解决方案中的每个项目中?如果它有效,你可以缩小哪些项目真正需要它?【参考方案4】:

我在使用 EF Core 3.15 的 MVC5 和 WebApi 的 .NET 4.8 WebApplication 中遇到了同样的问题。

输出代码在几个项目中分开。我只将 EF Core 引用添加到需要访问数据库的项目中。这会导致和你们在这里遇到的同样的问题。

在我将 EF Core 引用也添加到启动项目后,它按预期工作。

希望这对某人有所帮助。

【讨论】:

在同样的场景下,我发现我只需要将Microsoft.Data.SqlClient安装到我的启动项目中【参考方案5】:

这是由于 System.Data.SqlClient.TO 解决该问题而发生的,

1) 右键单击​​您的项目,然后单击管理 nuget 包。

2) 安装 Microsoft.Data.SqlClient 代替 System.Data.SqlClient

3)重建项目并发布

(我使用的是 .net core 2.0 web api)

【讨论】:

为什么要重复现有的答案?【参考方案6】:

对我来说,稍微修改了 nate 的方式,对我有用:

<Import
   Project="$(NuGetPackageRoot)Microsoft.Data.SqlClient.SNI.1.1.0\build\net46\Microsoft.Data.SqlClient.SNI.targets"
   Condition="Exists('$(NuGetPackageRoot)Microsoft.Data.SqlClient.SNI.1.1.0\build\net46\Microsoft.Data.SqlClient.SNI.targets')" 
/>

【讨论】:

【参考方案7】:

如果您在拉取更改时使用新添加 EFCore 的源代码管理,请尝试恢复 nuget 包,然后关闭并重新打开 Visual Studio。

我们目前猜测项目文件中的这一行在恢复包时没有正确执行

<Import Project="..\..\packages\Microsoft.Data.SqlClient.SNI.1.1.0\build\net46\Microsoft.Data.SqlClient.SNI.targets" Condition="Exists('..\..\packages\Microsoft.Data.SqlClient.SNI.1.1.0\build\net46\Microsoft.Data.SqlClient.SNI.targets')" />

这似乎是一个愚蠢的答案,但它对我们有用。

【讨论】:

以上是关于无法加载 DLL 'sni.dll' - 实体框架核心的主要内容,如果未能解决你的问题,请参考以下文章

“无法加载指定的元数据资源”错误实体框架

无法使用实体框架找到或加载 Npgsql

为啥实体框架 6.1.3 抛出“无法加载类型‘System.Data.Entity.Infrastructure.TableExistenceChecker’”

SQL Compact 3.5 SP2 CU2 实体框架问题

无法加载实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer”

csharp 无法加载“System.Data.SqlClient”ADO.NET提供程序的实体框架修复程序。