实体框架 - 基础提供程序在 ConnectionString 上失败

Posted

技术标签:

【中文标题】实体框架 - 基础提供程序在 ConnectionString 上失败【英文标题】:Entity Framework - The underlying provider failed on ConnectionString 【发布时间】:2011-01-10 15:49:18 【问题描述】:

在使用实体框架时,我已将其拆分为自己的项目:

RivWorks.Model - 包含实体模型 RivWorks.Controller - 使用实体模型并包含商业规则 RivWorks.View.Web - 网站 RivWorks.View.Services - WCF 项目

网站上的一切都运行良好。我可以调用控制器并返回一个有效的模型。当我从 Web.Service 尝试同样的事情时,我收到了这个错误:

错误: ConnectionString 上的基础提供程序失败。 堆栈跟踪: 在 System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString) 在 System.Data.EntityClient.EntityConnection..ctor(String connectionString) 在 System.Data.Objects.ObjectContext.CreateEntityConnection(String connectionString) 在 System.Data.Objects.ObjectContext..ctor(String connectionString, String defaultContainerName) 在 RivWorks.Model.Entities.RivFeedsEntities1..ctor(String connectionString) 在 RivWorks.Model.FeedStoreReadOnly..ctor(String connectionString) 在 RivWorks.Controller.ProductManager.LookupProduct(String productID, String sku, String urlRef, String env, String logPath)

我有点困惑,为什么并仔细研究错误日志,我终于发现连接字符串没有从网站的配置文件中读取。所以,我添加了一些代码来捕捉它,现在,硬编码了这些值。喜欢:

public dataObjects.NegotiateSetup LookupProduct(string productID, string sku, string urlRef, string env, string logPath)

    string feedConnString = "";
    string rivConnString = "";

    log.InitializeLogFile(logPath);
    dataObjects.NegotiateSetup resultSet = new dataObjects.NegotiateSetup();

    try  feedConnString = AppSettings.FeedAutosEntities_connString; 
    catch  feedConnString = @"metadata=res://*/Entities.FeedEntities.csdl|res://*/Entities.FeedEntities.ssdl|res://*/Entities.FeedEntities.msl;provider=System.Data.SqlClient;provider connection string='Data Source=***.***.***.***;Initial Catalog=******;Persist Security Info=True;User ID=******;Password="******";MultipleActiveResultSets=True'"; 

    try  rivConnString = AppSettings.RivWorkEntities_connString; 
    catch  rivConnString = @"metadata=res://*/Entities.RivEntities.csdl|res://*/Entities.RivEntities.ssdl|res://*/Entities.RivEntities.msl;provider=System.Data.SqlClient;provider connection string='Data Source=******;Initial Catalog=******_Dev;Persist Security Info=True;User ID=******;Password="******";MultipleActiveResultSets=True'"; 

    try
    
        using (RivFeedsEntities1 _dbFeed = new FeedStoreReadOnly(feedConnString).ReadOnlyEntities())
        
            using (RivEntities _dbRiv = new RivWorksStore(rivConnString).NegotiationEntities())
            

但是,唉,它仍然给我上面的错误!任何想法为什么?

【问题讨论】:

在 MSDN 上找到一个帖子,一年多没有回答。好难过,好难过。 social.msdn.microsoft.com/Forums/en/adodotnetentityframework/… 【参考方案1】:

我知道你一直在弄乱你的连接字符串来清理它们,但我猜你没有在密码周围输入"

他们真的需要吗?

【讨论】:

EntityFramework 以类似的方式存储其连接字符串,尽管我的 " 来自 provider connection string=,这可能是 Keith 出错的地方:metadata=res://*/Models.DoodleEF.csdl|res://*/Models.DoodleEF.ssdl|res://*/Models.DoodleEF.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.\SqlExpress;Initial Catalog=zhpCoreContent;Integrated Security=True;MultipleActiveResultSets=True"" 它们是直接从 App.Config 中复制出来的。我为 web.config 做了同样的事情 - 但等等 - 硬编码不理解“。 。早上会试一试。 伙计,我希望这里有另一个开发人员可以查看代码并看到隐藏在字符串中的简单错误。多谢你们!我替换了“使用字符串引号和上下文现在构建。转到下一个错误。 是的,我听到了……一个人很容易忽视事情。 谁能确切地说出 &quots 的来源?我肯定喜欢自动结束它,而不是总是记住“这个例外总是意味着去删除 &quots。”【参考方案2】:

仔细检查您的连接字符串是否正确,小错字可能会导致同样的错误。

这是错误的:

 <add name="Entities" connectionString="metadata=res://*/OnlineAB.csdl|res://*/OnlineAB.ssdl|res://*/OnlineABSuperAdmin.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source.;initial catalog=

这是对的:

 <add name="Entities" connectionString="metadata=res://*/OnlineAB.csdl|res://*/OnlineAB.ssdl|res://*/OnlineABSuperAdmin.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=

DataSource 之后查看我缺少一个等号。

【讨论】:

以上是关于实体框架 - 基础提供程序在 ConnectionString 上失败的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 6 错误服务器版本:(System.Data.SqlClient.SqlConnection)customerOrderContext.Database.Connection).Server

如何解决实体框架提供程序异常

在配置中更改实体框架提供程序

当 WCF 服务到 TCP/IP 时,底层提供程序在开放实体框架上失败

找不到实体框架 6 的兼容提供程序

实体框架是不是有内存提供程序?