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

没有为ADO找到实体框架提供程序。NET提供程序,使用不变名称'System.Data.SqlClient'。确保提供者在应用程序配置文件的“entityFramework”部分中注册。更多信息请参见http://go.microsoft.com/fwlink/?LinkId=260882。


当前回答

今天在处理一组web服务时遇到了这个问题,每个web服务都在不同的项目中,而一个单独的项目包含其中一些服务的集成测试。

我已经在EF5中使用这个设置有一段时间了,不需要包括集成测试项目中对EF的引用。

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

说明你也面临着同样的问题:

直接调用EF(连接到DB,获取数据等)工作正常,只要它们是从引用EF6的项目发起的。 通过已发布的服务接口调用服务工作正常;也就是说,在服务中“内部”不存在缺失引用。 从服务外部的项目直接调用服务项目中的公共方法,将导致此错误,即使EF没有在该项目中使用;仅在被调用的项目内部

第三点是让我困惑了一段时间,我仍然不确定为什么需要这个。在我的集成测试项目中添加ref到EF6,在任何情况下都解决了这个问题…

其他回答

引用实体框架所在项目的启动项目需要在bin文件夹中包含以下两个程序集:

EntityFramework.dll EntityFramework.SqlServer.dll

在启动项目的.config文件的<configSections>中添加<section>将使第一个程序集在该bin目录中可用。你可以从实体框架项目的.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>

要使第二个.dll在bin文件夹中可用,尽管不实际,但可以从实体框架项目的bin文件夹中手动复制。 一个更好的选择是在实体框架项目的Post-Build Events中添加以下几行,这将使该过程自动化:

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

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

我想问题会解决的。

添加这个函数

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;
        }
    }
}

.

我有同样的错误。奇怪的是,它只发生在我使用dbContext查询我的任何模型或获得它的列表时:

var results = _dbContext.MyModel.ToList();

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

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

以下是关于如何管理所有解决方案的Nuget的截图:

您已经将EF添加到类库项目中。你还需要将它添加到引用它的项目(你的控制台应用程序,网站或任何东西)。