将 Entity Framework 部署到 Azure 时添加命名空间的连接字符串

Connection strings adding namespace when deploying Entity Framework to Azure

我正在使用 VS Studio 发布选项将一个站点部署到使用 EF6 的 Azure。

我使用数据库命名的默认行为,而不是指定连接字符串,因为我在多台机器上进行开发,这些机器混合了 localDB 或 SQL Express:

public WebsiteDBContext() : base("WebsiteDBContext")

EF 代码全部位于网站的单独项目中,因为它在共享同一数据库的多个网站上使用。

当我发布到 Azure 时,添加到 web.config 的连接字符串包括来自项目的命名空间,DBContext 代码位于:

<add name="Utils.Models.WebsiteDBContext" connectionString="Data Source=****.database.windows.net;Initial Catalog=MyDatabase;Persist Security Info=True;User ID=****;Password=****" providerName="System.Data.SqlClient" />
<add name="DefaultConnection" connectionString="Data Source=tcp:****.database.windows.net,1433;Initial Catalog=CreweAllen;User ID=****;Password=****" providerName="System.Data.SqlClient" />
<add name="Utils.Models.WebsiteDBContext_DatabasePublish" connectionString="Data Source=****.database.windows.net;Initial Catalog=MyDatabase;Persist Security Info=True;User ID=****;Password=****" providerName="System.Data.SqlClient" />

迁移失败 运行 我认为是因为找不到数据库。

如果我手动创建 tables 并删除迁移 table 创建网站失败:建立与 [=35= 的连接时发生与网络相关或特定于实例的错误] 服务器。服务器未找到或无法访问。验证实例名称是否正确并且 SQL 服务器配置为允许远程连接。 (提供商:SQL 网络接口,错误:52 - 无法找到本地数据库运行时安装。

但是如果编辑 web.config 并从 WebsiteDBContext 连接字符串中删除 "Utils.Models." 而不是 WebsiteDBContext_DatabasePublish 它连接到数据库就可以了。

如何正确命名连接并迁移到 运行?已经试了好几次都没找到解决方法。

谢谢

您的上下文 class 名为 WebsiteDBContext。按照惯例,您的 web.config 中会有一个名为 WebsiteDBContext 的连接字符串。当您通过此向导启用代码迁移时,该向导将创建一个名为 WebsiteDBContext_DatabasePublish 的第二个连接字符串,它将 仅用于 运行 您的代码首次迁移。

更新您的 DbContext,其中数据发布内容仍在 webconfig 中,但不,我不再收到异常。

    public WebsiteDBContext():base("WebsiteDBContext", throwIfV1Schema: false) // throwIfV1Schema:false was added as the Identity V2 was causing an error in Azure

详情请参考issue

终于解决了。

已发布的应用程序找不到名称为 "WebsiteDBContext" 的连接字符串,因为 VS 部署向导正在命名连接字符串 "Utils.Models.WebsiteDBContext",因此它正在回退到默认值EF 连接是 localDB:

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">

当我停止在 DBContext 中显式命名数据库名称时:

public WebsiteDBContext() : base() 

然后应用程序查找的连接名称是它找到的 "Utils.Models.WebsiteDBContext"。

因此,通过 VS 向导使用名为 DBContext 发布到 Azure 的效果不佳,因为在 Azure 上创建的连接字符串具有完整的命名空间。