ChatGPT解决这个技术问题 Extra ChatGPT

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序

通过nuget下载EF6并尝试运行我的项目后,它返回以下错误:

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分注册。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。

https://i.stack.imgur.com/78mKj.png

我使用没有 providersprovider 的 EF5,所以考虑删除它吗?
把你的连接字符串的副本放在这里
连接字符串在图片中(App.confing),顺便说一句很简单,我调用构造函数,public BaseStorage(): base ("RaptorDB") {},BaseStorage() 继承自 EF5 中的 DbContext 一切正常,在 EF6 中还没有。
问题将通过安装EF6,第二个项目(控制台)来解决,感谢以任何方式提供帮助的每个人!
对我来说,这似乎是由于 Visual Studio 没有意识到基础项目实际使用了 EntityFramework.SqlServer 程序集。如果您执行 @Carra's answer 之类的操作,则不必将 EF 添加到引用您的基础项目的每个项目中 - 更简洁。

J
Jim Aho

我刚刚遇到了同样的问题,虽然从 NuGet 包管理器安装的 EntityFramework 似乎没有正确安装在项目中。

我设法通过在 Package Manager Console 上运行以下命令来修复它:

PM> Install-Package EntityFramework

PMC 写道“EntityFramework 6.0.1”已经安装,但将其添加到我的控制台应用程序中(它实际上没有使用 EF),但它也为我做了诀窍。 II 从控制台应用程序引用中删除 EF,错误返回,我不明白 - 我的控制台应用程序正在使用存储库项目(使用 EF) 感谢您的帮助!
如果您的解决方案中有多个项目,请不要忘记将 -ProjectName 添加到命令行...!!!
使用 -Pre 选项告诉 nuget 安装预发布包。我不建议使用它。我有类似的错误,但解决方案是在宿主项目中安装 EntityFramework。我已将其安装在类库中,但未安装在主项目(网络/控制台/或其他)中,
这里同样的问题。我有一个项目没有对 EF 的引用,但 EF dll 在 Debug 文件夹中。对此项目运行此命令会将 EntityFramework.SqlServer.dll 添加到 Debug 文件夹 - 问题已解决。
在我的情况下,直到我将项目部署到我们的测试服务器上,这个错误才出现。实际上,缺少的是 EntityFramework.SqlServer.dll 并且通过包管理器安装 EF 是有效的。它只是将两个相关引用添加到项目中,然后将 entityFramework 设置添加到 web.config。我猜本地 IIS 可以在本地获取程序集,但由于权限,Web 服务器上的完整 IIS 不能?
C
Clément Picou

您已将 EF 添加到类库项目中。您还需要将它添加到引用它的项目中(您的控制台应用程序、网站或其他)。


这是一个绝对荒谬的答案。为什么我需要这样做?你知道什么更可笑吗?有用。
请参阅下面的答案,您无需在控制台应用程序中安装 EF。
你的回答是正确的。仅将引用 EntityFramework.SqlServer.dll 添加到使用带有 EF 的库的前端项目中,修复问题。所以不要使用这个 EF(只有 DLL)
您不必必须在控制台/Web 应用程序中添加对 EF 的引用。您只需确保将 EntityFramework.SqlServer.dll 复制到 bin 目录。添加强引用可能会破坏您的体系结构(如果您构建了多个层,那么您的顶级执行程序集甚至不应该知道 EF)。相反,您可以确保复制 SQL Server 提供程序。参见例如 stackoverflow.com/a/19130718/870604
我怀疑 EntityFramework.SqlServer.dll 未被检测为依赖项的原因是因为 Entity Framework 动态加载它。当对 SQL 提供程序的唯一引用在配置文件中时,您的项目应该如何知道复制它?
P
Phil

您无需在控制台应用程序中安装 Entity Framework,只需添加对程序集 EntityFramework.SqlServer.dll 的引用。您可以将此程序集从使用实体框架的类库项目复制到 LIB 文件夹并添加对它的引用。

总之:

类库应用程序:安装实体框架 编写数据层代码 app.config 文件包含与实体框架相关的所有配置,但连接字符串除外。

安装实体框架

编写数据层代码

app.config 文件包含与实体框架相关的所有配置,但连接字符串除外。

创建控制台、Web 或桌面应用程序:添加对第一个项目的引用。添加对 EntityFramework.SqlServer.dll 的引用。 app.config/web.config 具有连接字符串(请记住,配置条目的名称必须与 DbContext 类的名称相同。

添加对第一个项目的引用。

添加对 EntityFramework.SqlServer.dll 的引用。

app.config/web.config 具有连接字符串(请记住,配置条目的名称必须与 DbContext 类的名称相同。

我希望它有所帮助。


正确答案。无需安装 EF。 EntityFramework.SqlServer.dll 。
我不得不同意。这完全是正确答案。引用 1/2 mb 的 dll 或拉出 > 5.5 mb 的 EF nuget 项目。也减少了一点架构多层的价值。 MS 的表现真的很差:我有 4 层,我的顶层真的没有理由对 EF 有任何了解
总之还是很可笑。例如,为什么前端需要对 SqlServer 的引用?就我而言,前端不在乎。但它有效。 +1
这很有帮助。非常感谢。
这不会使更新 EntityFramework 的版本变得困难吗?你必须记得去更新对 DLL 的引用
R
Ravi Ram

如果您忘记包含“EntityFramework.SqlServer.dll”,您也可以看到此消息。

它似乎是 EF6 中新添加的文件。最初我没有将它包含在我的合并模块中并遇到了这里列出的问题。


当我之前有一个项目 (a) 引用了一个项目 (b) 引用了 EF 时,我遇到了这个问题。清理和删除项目 (a) bin 文件夹,然后重建后,遇到了 EF 引用,但没有遇到 EF.SqlServer.dll。手动复制这个对我有用
@dan richardson 感谢您提到“删除 bin 文件夹”。
在 EF6 升级后尝试运行 LINQPad 脚本时出现错误。即使在 LINQPad 中引用 EntityFramework.SqlServer.dll 也没有修复它,直到我在 VS2013 中重建了我的解决方案。然后新的引用在 LINQPad 中正确解析,我的脚本运行了!
就我而言,我在开发环境中还可以,但是当我发布时出现了引用的问题。在将 dev 中的库列表与服务器中的 bin 文件夹进行比较后,我注意到没有 EntityFramework.SqlServer.dll,我只是上传它并刷新应用程序,瞧它修复了。
这是我的问题,谢谢!请参阅@Anders 提供的干净解决方案,以避免忘记在每个所需项目中包含 DLL 的问题。
A
Anders

无需将 EntityFramework.SqlServer 添加到宿主项目,您可以确保从您的模型/实体项目中对其进行静态引用,如下所示

static MyContext()
{
    var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    if(type == null)
        throw new Exception("Do not remove, ensures static reference to System.Data.Entity.SqlServer");
}

这将使构建过程包括与宿主项目的程序集。

更多信息在我的博客 http://andersmalmgren.com/2014/08/20/implicit-dependencies-and-copy-local-fails-to-copy/


我认为这是一个很好的干净解决方案,我们不必在应该与持久性无关的项目中包含对持久性相关 DLL 的引用。
同意,它适用于任何具有隐式依赖关系的库,而不仅仅是持久性
当您对程序集中的类型有显式依赖时,它将被构建过程复制。但是,在这里您没有显式依赖关系,并且构建过程将无法将程序集复制到构建文件夹。我的代码只是确保在所述程序集中存在对任何类型的显式引用。
没有它,您的代码对程序集没有显式依赖,也不会被复制到输出
这太棒了。
U
Umar Abbas

通过 Nuget 安装 Entity Framework 6 时。 EntityFramework.SqlServer 有时会错过另一个可执行文件。只需将 Nuget 包添加到该项目。

有时以上不适用于测试项目

要在测试项目中解决这个问题,只需将此方法放在测试项目中:

public void FixEfProviderServicesProblem()
{
    var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

从未调用过此方法,但根据我的观察,编译器将删除所有“不必要的”程序集,并且在不使用 EntityFramework.SqlServer 的情况下测试失败。


好吧,这并不漂亮,但它解决了我在测试项目中遇到的问题。其他解决方案均无效。
就我而言,在“管理解决方案的 Nuget 数据包”中将实体框架也添加到我的测试项目中就足够了
实际上,您需要放入任何项目(不仅是测试)以确保 System.Data.Entity.SqlServer 将在编译后包含在“结果库集”中(注意:Unity 或其他 IoC 工具可能会更改此规则,您将需要从测试项目中调用此代码)。
这实际上是最好的解决方案,因为您不必在项目中到处喷洒实体框架引用。
这为我指明了正确的方向。 EntityFramework.SqlServer 已添加到您的类库中,但如果不使用,它将不会放在应用程序的输出文件夹中。我通过添加 ExecutionStrategy 解决了这个问题,我仍然需要这样做,因此在 DbConfiguration 类中添加类似 SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy()); 的行解决了这个问题。
J
Johannes

添加此功能

private void FixEfProviderServicesProblem()

到库类中的数据库上下文类和缺少的 DLL EntityFramework.SqlServer.dll 将被复制到正确的位置。

namespace a.b.c
{
    using System.Data.Entity;

    public partial class WorkflowDBContext : DbContext
    {
        public WorkflowDBContext()
            : base("name=WorkflowDBConnStr")
        {
        }

        public virtual DbSet<WorkflowDefinition> WorkflowDefinitions { get; set; }
        public virtual DbSet<WorkflowInstance> WorkflowInstances { get; set; }
        public virtual DbSet<EngineAlert> EngineAlerts { get; set; }
        public virtual DbSet<AsyncWaitItem> AsyncWaitItems { get; set; }
        public virtual DbSet<TaskItem> TaskItems { get; set; }
        public virtual DbSet<TaskItemLink> TaskItemLinks { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }

        private void FixEfProviderServicesProblem()
        {
            // The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
            // for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. 
            // Make sure the provider assembly is available to the running application. 
            // See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
            var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
        }
    }
}

.


很抱歉试图撤销它......因为我认为它不会起作用......它确实有效!......它说我不能改变我的投票,除非答案被编辑,因为它太长了,从那以后锁...
这对我也有用。我们有一个使用 EF 6 的库项目和一个使用该库的控制台应用程序。我们得到了与 OP 相同的异常。我们不希望将 EntityFramework 特定的配置放在应用程序配置文件中,所以这种方法对我们有用。谢谢
你在哪里调用 FixEfProviderServicesProblem 我在构造函数中尝试过,但没有运气。
我从不叫它——不必。存在的事实使 .net 认为它需要它并将 EntityFramwork 包含为依赖项。
可能来自 stackoverflow.com/a/19130718/1467396 ?但是+1,无论如何,为了清楚如何/在哪里使用它。
C
Community

这些都不适合我。我确实在 another stackoverflow question 中找到了解决方案。我将在此处添加以方便参考:

您需要进行引用,因此它将被复制到 den 应用程序路径中。因为后面会在运行时引用。所以你不需要复制任何文件。

private volatile Type _dependency;

public MyClass()
{
    _dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}

这个!无需添加对可能引用此程序集的其他项目的引用。
L
Leonel B.

引用正在使用 Entity Framework 的项目的启动项目需要在其 bin 文件夹中包含以下两个程序集:

实体框架.dll

EntityFramework.SqlServer.dll

<section> 添加到启动项目的 .config 文件的 <configSections> 中,可使该 bin 目录中的第一个程序集可用。您可以从 Entity Framework 项目的 .config 文件中复制它:

<configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>

为了使 bin 文件夹中的第二个 .dll 可用,虽然不实用,但可以从实体框架项目的 bin 文件夹中进行手动复制。更好的替代方法是在 Entity Framework 项目的 Post-Build Events 中添加以下行,这将自动化该过程:

cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\

谢谢,我在数据层中有实体框架,所以它是隔离的,但不幸的是,微软不允许我们真正隔离数据层,并使我们用数据库技术污染用户体验。我希望我不必那样做。
P
Pragmateek

在将 Entity Framework 6 与 SQL Server Compact 4.0 一起使用时,我遇到了同样的错误。 EF6 的 Entity Framework Providers 的 MSDN 文章很有帮助。在包管理器控制台上将相应的提供程序命令作为 nuget 包运行可能会解决问题,因为 NuGet 包也会自动将注册添加到配置文件中。我运行 PM> Install-Package EntityFramework.SqlServerCompact 来解决问题。


到目前为止,我真的很惊讶没有人为此投票!错误消息清楚地说明:错误的原因是在 EF 升级之后,应用程序的 web.config 文件中确实没有为 SQL Compact 留下提供程序定义!添加您提到的软件包可修复 web.config 文件,并且将定义提供程序。
简直是救命稻草。它应该被标记为答案,因为它清楚地提供了问题的解决方案
K
Kamil Budziewski

当测试项目中发生错误时,最漂亮的解决方案是用以下方式装饰测试类:

[DeploymentItem("EntityFramework.SqlServer.dll")]

它确实很漂亮,但会产生更多的工作并且更容易忘记。使用“强制引用”技巧,您只需要在真正需要使用 EF 的项目上执行此操作。
C
Community

今天在使用一组 Web 服务时遇到了这个问题,每个服务都在不同的项目中,以及一个包含对其中一些服务的集成测试的单独项目。

我在 EF5 中使用此设置已有一段时间了,无需在集成测试项目中包含对 EF 的引用。

现在,在升级到 EF6 之后,似乎我也需要在集成测试项目中包含对 EF6 的引用,即使它没有在那里使用(几乎正如上面 user3004275 所指出的那样)。

您面临同样问题的迹象:

直接调用 EF(连接到数据库、获取数据等)工作正常,只要它们是从引用 EF6 的项目启动的。

通过已发布的服务接口调用服务可以正常工作;即服务中没有“内部”缺失的引用。

从服务外的项目直接调用服务项目中的公共方法会导致此错误,即使该项目本身没有使用 EF;仅在被调用项目内部

第三点是什么让我有一段时间,我仍然不确定为什么需要这样做。在我的集成测试项目中添加对 EF6 的引用无论如何都解决了它......


T
Taran

将以下内容添加到您的 app.config。

 <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

您还需要将其注册到 <configSections> - <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
这就是“IInstall-Package EntityFramework”所做的。这实际上不是必需的,因为默认情况下 EntityFramework 会尝试为 SqlClient 不变名称加载 EntityFramework.SqlServer.dll。此方法可用于替代提供程序。
O
Ondřej

我今天刚遇到这个问题。我有带有 EF63 NuGet 包和用于测试的控制台应用程序的数据存储库类库,它们仅引用类库项目。我创建了非常简单的构建后命令,它将 EntityFramework.SqlServer.dll 从类库的 Bin\Debug 文件夹复制到控制台应用程序的 Bin\Debug 文件夹并解决了问题。不要忘记将 entityFramework 部分添加到控制台应用程序的 .config 文件中。


B
BehrouzMoslem

我也有类似的问题。通过执行以下操作解决了我的问题:

https://i.stack.imgur.com/6ibKF.png

https://i.stack.imgur.com/YyRro.png


u
user2956314

您只是缺少对 EntityFramework.SqlServer.dll 的引用。对于使用 SQL Server 的 EntityFramework 项目,需要参考的两个文件是 EntityFramework.SqlServer.dll 和 EntityFramework.dll


D
David

删除 BIN 文件夹为我做了


R
Rosberg Linhares

您应该强制对 EntityFramework.SqlServer.dll 程序集进行静态引用,但您可以以更漂亮的方式执行此操作,而不是放置虚拟代码:

如果您已经有一个 DbConfiguration 类: public class MyConfiguration : DbConfiguration { public MyConfiguration() { this.SetProviderServices(System.Data.Entity.SqlServer.SqlProviderServices.ProviderInvariantName, System.Data.Entity.SqlServer.SqlProviderServices.Instance);如果您没有 DbConfiguration 类,则必须在应用启动时(在使用 EF 之前)放置以下代码: static MyContext() { DbConfiguration.Loaded += (sender, e) => e.ReplaceService ((s, k) => System.Data.Entity.SqlServer.SqlProviderServices.Instance); }


y
yaserjalilian

只需将 EntityFramework.SqlServer.dll 复制到 bin 文件夹中


K
Kuntal Ghosh

我刚刚使用 Nuget 重新安装了实体框架。并按照以下链接上的说明进行操作:http://robsneuron.blogspot.in/2013/11/entity-framework-upgrade-to-6.html

我认为问题会得到解决。


一个解释会很好!为什么你必须重新安装它等等
因为某些未知原因,更改不会生效,所以我重新安装了 EntityFramework 6.1.1,然后它才生效。
u
user2347528

展开 YourModel.edmx 文件并打开 YourModel.Context.tt 下的 YourModel.Context.cs 类。

我在 using 部分添加了以下行,并且为我修复了错误。

使用 SqlProviderServices = System.Data.Entity.SqlServer.SqlProviderServices;

每次自动生成文件时,您可能必须将此行添加到文件中。


W
Willy David Jr

我有同样的错误。奇怪的是,只有当我使用 dbContext 查询我的任何模型或获取它的列表时才会发生这种情况:

var results = _dbContext.MyModel.ToList();

我们尝试重新安装实体框架,正确引用它但无济于事。

幸运的是,我们尝试检查 Nuget 的 ALL 解决方案,然后更新所有内容或确保 everything 是相同版本,因为我们注意到这两个项目在 Web 项目上具有不同的 EF 版本。它有效。错误消失了。

这是有关如何为所有解决方案管理 Nuget 的屏幕截图:

https://i.stack.imgur.com/uJYe0.png


V
Vijaya Malla

只需将 EntityFramework 包安装到您的 Web/控制台项目。这应该将该部分添加到您的配置文件中。


T
Tobi Owolawi

似乎没有人提到首先检查系统中是否安装了 System.Data.SqlClient 以及是否对其进行了引用。

我通过安装 System.Data.SqlClient 并在 app.Config 中添加新提供程序解决了我的问题

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>

u
user2588362

此外,请确保您启动的项目是包含您的 dbcontext(或相关的 app.config)的项目。我正在尝试启动一个没有所有必要配置设置的网站项目。


S
SharpC

我几乎尝试了上述所有方法,但没有任何效果。

只有当我将默认项目 EntityFrameworkEntityFramework.SqlServer 属性 Copy Local 中的引用 DLL 设置为 True 时,它才开始工作!


这些已经存在于 EntityFramework (6.4.4) 的编译时程序集中。位置是 C:\Users\\.nuget\packages\entityframework\6.4.4\lib\netstandard2.1。您能否分享更多关于您为使这些“参考”所做的工作?
V
Vahid Akbari

大家我需要你注意,两个 dll EntityFramework.dll 和 EntityFramework.SqlServer.dll 是 DataAccess 层库,在视图或任何其他层中使用它们是不合逻辑的。它解决了你的问题,但它不合逻辑。

合乎逻辑的方法是实体属性删除并用 Fluent API 替换它们。这是真正的解决方案


d
dkero

我有一个控制台应用程序和类库。在类库中,我创建了实体数据模型(右键单击类库 > 添加 > 新项目 > 数据 > ADO.NET 实体数据模型 6.0)并将引用放在控制台应用程序中。因此,您拥有引用类库的控制台应用程序,并且在类库内部您拥有 EF 模型。当我试图从表中获取一些记录时,我遇到了同样的错误。

我按照以下步骤解决了这个问题:

右键单击解决方案并选择“管理解决方案的 NuGet 包”选项,然后将显示 NuGet 包管理器窗口。转到“已安装包”下的“管理”选项提示:实体框架已添加到类库中,因此您将在“已安装包”下拥有 EntityFramework,您将看到“管理”选项单击“管理”选项并检查安装包到引用包含 EF 模型的类库的项目(在我的情况下,我设置复选框以将包安装到控制台应用程序,该应用程序引用了内部具有 EF 模型的类库)

这就是我所要做的,一切都很完美。

我希望它有所帮助。


m
msz

我有同样的问题(在我的 3 轮胎级项目中),我通过将 EF 添加/安装到我的主项目来修复它。


u
user2662643

从 CE db 迁移到 Azure 上的 Sql Server 时,我遇到了一个相关问题。只是浪费了 4 小时试图解决这个问题。希望这可以挽救一个类似的命运。对我来说,我的 packages.config 文件中有对 SqlCE 的引用。删除它解决了我的整个问题并允许我使用迁移。 Yay Microsoft 为另一种技术提供了不必要的复杂设置和配置问题。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅