繁体   English   中英

EF 6 未在 Web.config 中使用连接字符串

[英]EF 6 not using connection string in Web.config

我收到以下错误,我一生都无法解决该错误。 我正在使用带有 Identity 2 的 EF 6,几天前它运行良好。

我昨天启动了 VS 2015,并在发布到测试站点和本地时都开始收到错误消息。 即使 Web.config 配置为使用 SQL 2014 标准服务器,EF 也几乎在寻找 SQL Express 的本地实例。

这是错误:

“/”应用程序中的服务器错误。 与 SQL Server 建立连接时发生与网络相关或特定于实例的错误。 服务器未找到或无法访问。 验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) 描述:在当前 Web 请求的执行过程中发生未处理的异常。 请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

SQLExpress 数据库文件自动创建错误:

连接字符串使用应用程序的 App_Data 目录中的数据库位置指定本地 Sql Server Express 实例。 提供者尝试自动创建应用程序服务数据库,因为提供者确定该数据库不存在。 以下配置要求是成功检查应用服务数据库是否存在并自动创建应用服务数据库所必需的:

如果应用程序在 Windows 7 或 Windows Server 2008R2 上运行,则需要特殊的配置步骤来启用提供程序数据库的自动创建。 更多信息请访问: http : //go.microsoft.com/fwlink/?LinkId=160102 如果应用程序的 App_Data 目录尚不存在,则 Web 服务器帐户必须具有对应用程序目录的读写访问权限。 这是必要的,因为如果 App_Data 目录不存在,Web 服务器帐户将自动创建。 如果应用程序的 App_Data 目录已经存在,则 Web 服务器帐户只需要对应用程序的 App_Data 目录的读写访问权限。 这是必要的,因为 Web 服务器帐户将尝试验证 Sql Server Express 数据库是否已存在于应用程序的 App_Data 目录中。 从 Web 服务器帐户撤消对 App_Data 目录的读取访问权限将阻止提供程序正确确定 Sql Server Express 数据库是否已存在。 当提供程序尝试创建现有数据库的副本时,这将导致错误。 需要写访问权限,因为在创建新数据库时会使用 Web 服务器帐户的凭据。 必须在机器上安装 Sql Server Express。 Web 服务器帐户的进程标识必须具有本地用户配置文件。 有关如何为计算机和域帐户创建本地用户配置文件的详细信息,请参阅自述文件。

源错误:

执行当前 Web 请求期间生成了未处理的异常。 可以使用下面的异常堆栈跟踪来识别有关异常来源和位置的信息。

堆栈跟踪:

[SqlException (0x80131904): 与 SQL Server 建立连接时发生与网络相关或特定于实例的错误。 服务器未找到或无法访问。 验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:SQL 网络接口,错误:26 - 错误定位服务器/指定的实例)] System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,Boolean breakConnection,Action`1 wrapCloseInAction)+92 System.Data.SqlClient.TdsParser。 ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +285

这是 Web.config 中的连接字符串和 EF 配置:

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  <providers>
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  </providers>
</entityFramework>
<connectionStrings>
  <add name="DefaultConnection" connectionString="Data Source=SQL5017.Smarterasp.net;Initial Catalog=DB_9CF975_moverlive;User Id=xxxxxxxxx;Password=xxxxxxx;" providerName="System.Data.SqlClient" />
</connectionStrings>

我可以使用带有上述连接字符串的 SQL Server Management Studio 很好地连接到数据库。

我应该寻找什么?

首先要检查的是您的数据库上下文,以确保您已指定连接字符串的名称:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", false)
    {
    }

    // ...

您的连接字符串看起来不错。 该错误表明您的 web.config 或代码中仍有一些东西正在寻找 App_Data 目录,这很奇怪。 您是否尝试在 App_Data 或 |DataDirectory| 的解决方案中查找 .

看起来,您的代码或 (LocalDb) 或 SQlExpress 中某处引用了 App_data 文件夹

您不会碰巧在Web.config文件下有一个 Config Transform 文件,比如Web.Debug.configWeb.Release.config ,是吗? 它可能正在重写您的连接字符串。

通常,配置转换文件会在您发布站点时进行转换,但我不确定它们在某些调试模式下的工作方式,因为 IIS Express 和本地 IIS 等 ASP 项目有几种模式。

我今天遇到了一个 App.config 文件,一个 App.Debug.config 正在重写我的连接字符串,我什至没有注意到有一个 App.Debug.config 直到我扩展节点。 它有一个完全不同的连接字符串。

经过多次调试后,我在 Startup.Auth.cs 的namespace中发现了一个错字

这意味着没有连接字符串传递给DefaultConnectionFactory ,这意味着连接工厂然后使用上下文名称作为默认连接字符串中的数据库名称。 (除非注册了不同的DefaultConnectionFactory否则此默认连接字符串指向本地计算机上的.\\SQLEXPRESS 。)

更正命名空间后,一切都按计划运行:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM