【问题标题】:EF 4.1 exception "The provider did not return a ProviderManifestToken string"EF 4.1 异常“提供程序未返回 ProviderManifestToken 字符串”
【发布时间】: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 分钟盯着必须与上下文名称匹配的连接字符串名称中的错字。

标签: asp.net sql entity


【解决方案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,我能够成功连接。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-04-04
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-09-28
                    • 2012-08-08
                    • 2014-02-25
                    相关资源
                    最近更新 更多