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 (<Binary data>)
列不向后兼容 - 因此出现 The provider did not return a ProviderManifest instance
错误,因为它无法解码。
我没有什么可失去的,只是彻底清除了这张桌子并运行Update-Database -Verbose
,然后重新启动并运行。
如果您处于高级环境中或已经投入生产,那么清除此表可能不是解决方案,但这种方式让我可以立即重新开始工作。
【讨论】:
我最终完全删除了 __MigrationsHistory 表,并使用Add-Migration
和 Update-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 字符串”的主要内容,如果未能解决你的问题,请参考以下文章