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

时间:2011-03-24 17:45:40

标签: asp.net sql entity

我正在尝试复制在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。

15 个答案:

答案 0 :(得分:183)

我收到了这个错误,并尝试了一些早期的建议。然后我检查了内部异常并注意到我为用户获得了一个简单的SQL登录失败。还有别的东西要检查。

答案 1 :(得分:8)

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

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

答案 2 :(得分:5)

我遇到了同样的错误,实际上它是指定服务器的登录失败。我从配置连接字符串中删除了“Integrated Security”属性,但它确实有效。

答案 3 :(得分:4)

我遇到了同样的问题,我在上下文的实例之后添加了下面的代码(例如onload)

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

答案 4 :(得分:4)

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

答案 5 :(得分:2)

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

希望它能与你合作。

答案 6 :(得分:2)

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

答案 7 :(得分:2)

我终于破解了它 - 经过一次轻微的疯狂追逐,认为这是由于权限。

启示录:使用SQL配置文件

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

使用SQL事件探查器我很快找到了报告失败之前执行的最后一个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)绑定。

enter image description here

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

我的猜测是Model (<Binary data>)列不向后兼容 - 因此The provider did not return a ProviderManifest instance错误,因为它无法对其进行解码。

我没有任何损失,只是完全消灭了这张桌子,然后跑了Update-Database -Verbose,然后重新开始运行。

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

答案 8 :(得分:1)

在使用Visual Studio 11 Beta和EF4.1以及ASP.NET MVC时,我差点把头发拉出来,直到找到

  

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”);

答案 9 :(得分:1)

  

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

来自CodePlex的引用,这与我合作(visual studio 2013 / MVC 5)

答案 10 :(得分:1)

如果您正在使用EF Code First,另外要考虑的是它有时不会自动为DbContext类创建支持数据库。解决方案是添加您自己的连接字符串 - 您可以使用可能存在的连接字符串来处理支持简单成员资格提供程序的用户/注册数据库,作为模板。 最后,您需要为您创建的DbContext类添加默认构造函数:

public ChaletDb():base("ChaletConnection")
    {

    }

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

答案 11 :(得分:0)

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

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

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

解决方案:删除上述代码。

答案 12 :(得分:0)

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

确保您运行该进程的用户帐户可以访问SQL Server。

如果您已从父线程生成DbContext(如使用依赖注入),然后如果您冒充其他用户,则会发生此错误。解决方案是在新线程或新的Impersonation上下文中生成DbContext。

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

我的实体框架出现了错误,但上述答案中没有一个最终符合最终有效的解决方案。

My EntityFramework Code First Models和DataContext位于我的WebAPI主项目的独立项目中。我的实体框架项目在编码行的某个地方被设置为启动项目,因此当我运行迁移时,我得到“提供者没有返回ProviderManifestToken字符串”...连接问题。

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