在通过NuGet下载EF6并尝试运行我的项目后,返回以下错误:
未找到与不变名称'System.Data.SqlClient'对应的ADO.NET提供程序的Entity Framework提供程序。 确保该提供程序已在应用程序配置文件的“entityFramework”部分中注册。欲知详情,请参见http://go.microsoft.com/fwlink/?LinkId=260882。
在通过NuGet下载EF6并尝试运行我的项目后,返回以下错误:
未找到与不变名称'System.Data.SqlClient'对应的ADO.NET提供程序的Entity Framework提供程序。 确保该提供程序已在应用程序配置文件的“entityFramework”部分中注册。欲知详情,请参见http://go.microsoft.com/fwlink/?LinkId=260882。
我遇到了同样的问题,看起来虽然通过NuGet包管理器安装了EntityFramework,但它没有正确安装到项目中。
我成功地通过在Package Manager Console上运行以下命令来解决了这个问题:
PM> Install-Package EntityFramework
-Pre
选项告诉 NuGet 安装预发布包。我不建议使用它。我遇到了类似的错误,但解决方案是在主项目(Web/控制台/或其他)中安装 EntityFramework,而不是在类库中安装。 - Davide IcardiEntityFramework.SqlServer.dll
被添加到了 Debug 文件夹中,问题得以解决。 - qujck您已将EF添加到类库项目中。 您还需要将其添加到引用它的项目(控制台应用程序,网站或其他项目)中。
EntityFramework.SqlServer.dll
复制到 bin 目录即可。 如果添加强引用可能会破坏架构(如果您构建了多个层次,则顶层执行程序集甚至不应知道 EF 的存在)。 可以确保 SQL Server 提供程序已复制。 例如,请参见 https://dev59.com/f2Yr5IYBdhLWcg3wAFg0#19130718 - ken2k在您的控制台应用程序中不需要安装Entity Framework,只需添加对EntityFramework.SqlServer.dll程序集的引用即可。您可以从使用Entity Framework的Class Library项目中复制此程序集到LIB文件夹并添加对它的引用。
总之:
如果您忘记包含“EntityFramework.SqlServer.dll”,也会看到此消息。
这似乎是EF6中新添加的文件。最初我没有将其包含在我的合并模块中,遇到了此处列出的问题。
不需要将 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/
当您通过Nuget
安装Entity Framework 6时,有时会错过另一个可执行文件EntityFramework.SqlServer。只需将Nuget
包添加到该项目即可。
有时对于测试项目上述方法不起作用
要解决测试项目中的这个问题,只需将此方法放置在测试项目中:
public void FixEfProviderServicesProblem()
{
var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
这个方法从未被调用,但根据我的观察,编译器会移除所有“不必要”的程序集,若不使用 EntityFramework.SqlServer
的东西,测试就会失败。
EntityFramework.SqlServer
已经被添加到你的类库中,但如果没有使用它,它将不会被放置在应用程序的输出文件夹中。我通过添加一个 ExecutionStrategy
来解决了这个问题,我仍然需要这样做,所以在 DbConfiguration
类中添加一行像 SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
的代码就可以解决问题了。 - Jan_V添加此函数
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;
}
}
}
.
FixEfProviderServicesProblem
?我尝试在构造函数中调用,但没有成功。 - Francis Ducharme这些方法都对我没用。我在另一个stackoverflow问题中找到了解决方案。为了方便参考,我会在这里添加:
你需要创建一个引用,这样它将被复制到应用程序路径中。因为它稍后将在运行时被引用。所以你不需要复制任何文件。
private volatile Type _dependency;
public MyClass()
{
_dependency = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
}
<configSections>
添加<section>
,可以使第一个程序集在该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>
为了使第二个.dll在bin文件夹中可用,虽然不实用,但可以从Entity Framework项目的bin文件夹手动复制。 更好的选择是在Entity Framework项目的Post-Build事件中添加以下行,将自动化该过程:
cd $(ProjectDir)
xcopy /y bin\Debug\EntityFramework.SqlServer.dll ..\{PATH_TO_THE_PROJECT_THAT_NEEDS_THE_DLL}\bin\Debug\
当测试项目出现错误时,最好的解决方法是用以下方式对测试类进行装饰:
[DeploymentItem("EntityFramework.SqlServer.dll")]
public BaseStorage(): base ("RaptorDB") {}
,BaseStorage() 继承自 EF5 中的 DbContext,在 EF5 中一切都运行得很完美,但在 EF6 中就不行了。 - Fernando Vellozo