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

C# 无法加载DLL';sni.dll';-实体框架核心,c#,asp.net-core-mvc,visual-studio-2017,entity-framework-core,C#,Asp.net Core Mvc,Visual Studio 2017,Entity Framework Core,在Visual Studio 2017上的ASP.Net Core应用程序中使用实体框架Core时,我间歇性地遇到错误“无法加载'sni.dll' 奇怪的是,我找到了一个临时解决办法:重新启动我的电脑 我不知道为什么错误不断发生,我不知道变量可能是什么。有人能解释一下可能的原因吗?我会提供一个完整的堆栈跟踪,但自从决定在这里发布后就没有发生过,下次发生时,我一定会更新它。不过我肯定知道(因为调试捕捉到异常)当EF有理由从数据库获取数据并转换为实体时,就会发生这种情况 提前感谢您的建议 --编辑

在Visual Studio 2017上的ASP.Net Core应用程序中使用实体框架Core时,我间歇性地遇到错误“无法加载'sni.dll'

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

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

提前感谢您的建议

--编辑 这种情况仍在发生。请记住捕获堆栈跟踪:

发生System.DllNotFoundException HResult=0x80131524 消息=无法加载DLL“sni.DLL”:指定的网络名称不再可用。(HRESULT异常:0x80070040) 来源= 堆栈跟踪: 位于System.Data.SqlClient.SnNativeMethodWrapper.UnmanagedIsTokenRestricted(IntPtr标记、布尔值和isRestricted) 位于System.Data.Win32NativeMethods.IsTokenRestrictedWrapper(IntPtr令牌) 位于System.Data.ProviderBase.DbConnectionPoolIdentity.GetCurrent()处 位于System.Data.ProviderBase.DbConnectionPoolGroup.GetConnectionPool(DbConnectionFactory connectionFactory) 位于System.Data.ProviderBase.DbConnectionFactory.GetConnectionPool(DbConnection owningObject,DbConnectionPoolGroup connectionPoolGroup) 位于System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection所有者连接、TaskCompletionSource
1重试、DbConnectionOptions用户选项、DbConnectionInternal oldConnection、DbConnectionInternal&connection)
位于System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection、DbConnectionFactory connectionFactory、TaskCompletionSource
1重试,DbConnectionOptions用户选项) 在System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1重试)
在System.Data.SqlClient.SqlConnection.Open()处
在Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open()中
位于Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable.Enumerator.BufferlessMovenText(布尔缓冲区)
在Microsoft.EntityFrameworkCore.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](Func
2操作,Func
2验证成功,TState状态)
在Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.d_u3中
在Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.d_u30
1.MoveNext()中
位于System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
1源) 在Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.c__显示类20_0
1.b__0(QueryContext qc)
位于System.Linq.Queryable.FirstOrDefault[TSource](IQueryable
1源)


添加nuget package System.Data.SqlClient v4.4.0为我解决了相同的问题。该问题不是实体框架特有的。它是由dotnet Core 2中不可用的旧版本的SqlClient对API的依赖性造成的。

在某些情况下,此问题可能是由于IIS没有足够的权限访问%USERPR的区域造成的文件%.nuget

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

向IIS应用池(如DefaultAppPool或FooAppPool)授予权限,以便不仅访问.Nuget文件夹(这通常是自动完成的)

在Identity下设置要作为“LocalSystem”运行的AppPool,这样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的版本(虽然这是相关的,但这是一个遗留问题),但是有一个聪明人()意识到这一点,并为此提供了许多帮助。

对于实体框架核心3.x,请安装Microsoft.Data.SqlClient Nuget包,而不是System.Data.SqlClient。

这是由于System.Data.SqlClient.要解决此问题

1) 右键单击您的项目,然后单击ManageNuGetPackage

2) 安装System.Data.SqlClient安装的Microsoft.Data.SqlClient

3) 重建项目并发布


(我正在使用.net core 2.0 web api)

我在使用EF core 3.15的带有MVC5和WebApi的.net 4.8 web应用程序中遇到了相同的问题

Out代码在几个项目中是分开的。我只在需要访问DB的项目中添加了EF核心引用。这导致了和你们一样的问题

在我将EF核心引用也添加到启动项目之后,它会按照预期工作


希望这对其他人有所帮助。

如果您正在使用源代码管理,在拉取更改时新添加了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')" />


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

完美。是的,这似乎有效。因为它的间歇性,我不能肯定,只有时间会告诉我。但我会将这个答案标记为正确。谢谢你的帮助。在我的情况下,这是更新System.Data.SqlClient的NuGet包的问题。我不会这么做我已经根据错误猜到了。谢谢!为什么要重复现有的答案?我得到了相同的错误,并且安装了Microsoft.Data.SqlClient软件包。@JonathanWood您是否尝试过安装它(可能还有EF Core软件包?)在解决方案中的每个项目中?如果可行,您可以缩小实际需要它的项目范围?在同一个场景中,我发现我只需要在启动项目中安装Microsoft.Data.SqlClient