EF 4.1 异常“提供程序未返回 ProviderManifestToken 字符串”

Posted

技术标签:

【中文标题】EF 4.1 异常“提供程序未返回 ProviderManifestToken 字符串”【英文标题】:EF 4.1 exception "The provider did not return a ProviderManifestToken string" 【发布时间】:2011-07-22 08:25:26 【问题描述】:

我正在尝试复制 MSDN 上的示例。我正在使用 ASP.NET 和 EF 4.1(CTP?)。我已经使用 NuGet 安装了 EntityFramework 包。

我收到此错误:The provider did not return a ProviderManifestToken string ... 并且永远不会创建数据库。

这是我的连接字符串:

<add name="HospitalContext"
   connectionString=
   "data source=.\SQLExpress;initial catalog=NewTestDB;integrated security=True;"
   providerName="System.Data.SqlClient"/>

这是我的代码:

var pat = new Patient  Name = "Shane123132524356436435234" ;
db.Patients.Add(pat);

var labResult = new LabResult  Result = "bad", Patient = pat ;

int recordAffected = db.SaveChanges();

这是我的上下文:

public class HospitalContext : DbContext

    static HospitalContext()
    
        Database.SetInitializer(new HostpitalContextInitializer());
    

    public DbSet<Patient> Patients  get; set; 
    public DbSet<LabResult> LabResults  get; set; 


public class HostpitalContextInitializer :
             DropCreateDatabaseIfModelChanges<HospitalContext>

    protected override void Seed(HospitalContext context)
    
        context.Patients.Add(new Patient  Name = "Fred Peters" );
        context.Patients.Add(new Patient  Name = "John Smith" );
        context.Patients.Add(new Patient  Name = "Karen Fredricks" );
    

这是一个完全修补的 SQL 2008 系统,带有 VS 2010 SP1。

【问题讨论】:

似乎在将 [Key] 添加到模型后,它可以解决该问题。我还有另一个问题,但这可能已经解决了。 另外,可能是我在连接字符串中添加了“Intergrated security=true”... 我在使用SqlServerCe.Entity.dll时遇到了同样的异常 出于对可能引发此异常的内容的兴趣 - 我花了 20 分钟盯着必须与上下文名称匹配的连接字符串名称中的错字。 【参考方案1】:

我遇到了这个错误,并尝试了一些早期的建议。然后我检查了内部异常并注意到我收到了用户的简单 SQL 登录失败。只是需要检查其他内容。

【讨论】:

在我的情况下,sql server 密码已过期 感谢您为我指明正确的方向。我的 SQL Express 服务没有启动 - 呃! 良好的内部异常...当我将 EF 指向新的备份位置时,我的数据库名称错误...有趣的是,我检查了 InnerEx,您的评论让我回去重读...荣誉! 正在使用集成安全,IIS AppPool 没有所需的权限。 +1 -(我的家庭 ip 已更改)错误消息:无法打开登录请求的服务器“SERVERNAME”。不允许 IP 地址为“MY_OLD_IP”的客户端访问服务器。要启用访问,请使用 SQL Azure 门户或在主数据库上运行 sp_set_firewall_rule 来为此 IP 地址或地址范围创建防火墙规则。此更改最多可能需要五分钟才能生效。\r\n用户“MYADMINACCT”登录失败。\r\n已为该会话分配了一个跟踪 ID“GUID”。当您需要帮助时,将此跟踪 ID 提供给客户支持。"【参考方案2】:

当您将连接字符串放在 Visual Studio 中错误项目的 app.config 中时,有时会发生这种情况。

例如,我在 EF 4.1(已发布版本)项目 + WCF 数据服务项目中遇到了这个问题,我注意到我没有在使用它的数据服务项目中指定连接字符串。

【讨论】:

这是我的解决方案。我必须在启动项目中放入正确的连接字符串。【参考方案3】:

我遇到了同样的问题,我在上下文实例之后添加了以下代码(通过示例加载)

context.Database.Connection.ConnectionString = @"Data Source=.\SQLExpress;Initial Catalog=Test;Integrated Security=True";

【讨论】:

【参考方案4】:

我遇到了同样的错误,实际上是指定服务器登录失败。我从配置连接字符串中删除了“集成安全”属性,它起作用了。

【讨论】:

此错误是在我的机器上关闭 SQL Express 服务时出现的。【参考方案5】:

我在使用 MvcMusicStore 应用时遇到了类似的问题。我将 Web.config 中的一行从 “实例=真”到“实例=假”。它有时可以在没有这种调整的情况下工作,但我不知道是什么导致了这种差异。读这个 http://msdn.microsoft.com/en-us/library/ms254504.aspx 并没有真正帮助。

【讨论】:

【参考方案6】:

由于某些权限原因,EF 无法创建数据库连接。 我一整天都面临同样的问题。最后我尝试了以下解决方案并且它有效: a/ 打开 IIS(我使用的是 IIS 7) b/打开网站正在使用的appool的高级设置(例如:DefaultAppPool) c/ 查看 Process Model 组,将 Identity 值更改为“Localsystem”

希望它对你有用。

【讨论】:

【参考方案7】:

我只是遇到了同样的问题... 对我有用的解决方案是: 运行客户端网络配置工具(在运行中键入 cliconfg) 并确保 TCP/IP 已启用..

【讨论】:

【参考方案8】:

我终于破解了它——经过一番小小的追逐后,我认为这是由于权限问题。

启示:使用 SQL PROFILER

(注意:我最近从 EF6 降级到了 EF5)

使用 SQL Profiler 我很快找到了在报告失败之前执行的最后一条 SQL:

SELECT TOP (1) 
[Project1].[C1] AS [C1], 
[Project1].[MigrationId] AS [MigrationId], 
[Project1].[Model] AS [Model]
FROM ( SELECT 
    [Extent1].[MigrationId] AS [MigrationId], 
    [Extent1].[Model] AS [Model], 
    1 AS [C1]
    FROM [dbo].[__MigrationHistory] AS [Extent1]
)  AS [Project1]
ORDER BY [Project1].[MigrationId] DESC

好吧,看看那个 - 与迁移有关。它正在查看 __MigrationHistory 表 - 我什至没有意识到它已经创建(我已经在我的 CSPROJ 中清除了迁移)并清除了它。

因此,我提取了该表的行,并查看它与特定产品版本 (v6) 相关联。

我实际上是从 EF6(我一开始并不打算安装)降级到 EF5(与脚手架更兼容)以及问题开始的时候。

我的猜测是 Model (&lt;Binary data&gt;) 列不向后兼容 - 因此出现 The provider did not return a ProviderManifest instance 错误,因为它无法解码。

我没有什么可失去的,只是彻底清除了这张桌子并运行Update-Database -Verbose,然后重新启动并运行。

如果您处于高级环境中或已经投入生产,那么清除此表可能不是解决方案,但这种方式让我可以立即重新开始工作。

【讨论】:

我最终完全删除了 __MigrationsHistory 表,并使用 Add-MigrationUpdate-Database -Verbose -Force 重新搭建了脚手架。这是一个命令参考coding.abel.nu/2012/03/ef-migrations-command-reference 重要的一点是这不仅仅是一个权限错误【参考方案9】:

在使用带有 EF4.1 和 ASP.NET MVC 的 Visual Studio 11 Beta 时,我差点把头发拔掉,直到找到

http://connect.microsoft.com/VisualStudio/feedback/details/740623/asp-net-mvc-4-default-connection-string-improperly-escaped

为了解决我的问题,我进入 Application_Start 并进行了更改

Database.DefaultConnectionFactory = new SqlConnectionFactory("Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");

Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");

【讨论】:

Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); 已添加到我的 Main 方法中,现在它就像一个魅力!非常感谢。【参考方案10】:

此错误仅在 .edmx 文件打开时出现,并在文件再次关闭时消失。

来自CodePlex 的这句话,这对我有用(visual studio 2013 /MVC 5)

【讨论】:

也和我一起工作过。尝试关闭并重新打开 edmx 文件。工作。【参考方案11】:

如果您使用的是 EF Code First,需要考虑的另一件事是它有时不会自动为您的 DbContext 类创建支持数据库。解决方案是添加您自己的连接字符串 - 您可以使用可能存在的连接字符串来处理支持 Simple Membership Provider 的用户/注册数据库,作为模板。 最后,您需要为您创建的 DbContext 类添加一个默认构造函数:

public ChaletDb():base("ChaletConnection")
    

    

在这里,您在 web.config 文件中输入的连接字符串的名称用于指示 DbContext 创建数据库。 偶尔,我不得不手动创建数据库(在 SQL Server Management Studio 中)以促使它工作。

【讨论】:

【参考方案12】:

我在一个解决方案中有多个项目,并在不同时间向每个项目添加了 EF。在某些机器上它正在工作,而在某些机器上它因上述错误而失败。我花了一段时间才注意到我的一些项目的 app.config 有这个:

    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="v11.0" />
  </parameters>
</defaultConnectionFactory>

如果您使用 LocalDb(类似新的“sql express”),这是可以的,但如果您没有安装特定服务器并使用常规 SQL,则完全错误。

解决方法:删除上面的代码。

【讨论】:

【参考方案13】:

这是因为与 SQL 服务器的连接失败。

确保运行该进程的用户帐户有权访问 SQL Server。

如果您从父线程生成了 DbContext(例如使用依赖注入),然后如果您正在模拟另一个用户,则会发生此错误。解决方案是在新线程或新模拟上下文中生成 DbContext。

【讨论】:

【参考方案14】:

我刚刚关闭了 Visual Studio 的所有实例并重新打开了我的解决方案。

我不知道到底发生了什么,但我从两个不同的本地工作区(一个带有我的本地更改,一个带有未更改的存储库源代码)打开了相同的解决方案。我使用 postgres DB、Entity Framework 6、Visual Studio 2013 和 ASP.NET MVC 5。

【讨论】:

【参考方案15】:

我对实体框架有一个错误,但上述答案都没有最终适合最终奏效的解决方案。

我的 EntityFramework Code First 模型和 DataContext 位于与我的 WebAPI 主项目不同的项目中。我的实体框架项目在编码线的某处被设置为启动项目,因此当我运行迁移时,我得到“提供程序没有返回 ProviderManifestToken 字符串”......连接问题。

事实证明,由于数据库的 ConnectionString 位于 WebAPI 主项目的 Web.config 文件中,因此当我运行迁移时,连接字符串没有被检索到。通过将 WebAPI 项目设置为我的 startProject,我能够成功连接。

【讨论】:

以上是关于EF 4.1 异常“提供程序未返回 ProviderManifestToken 字符串”的主要内容,如果未能解决你的问题,请参考以下文章

EF 4.1 代码优先关系表

EF 4.1 复杂关系的实体映射

使用EF 4.1的DbContext的方法大全

模型和表更改错误 EF 4.1

使用 EF 4.1 部署数据库更改

EF 4.1 RTM - EntityTypeConfiguration