将实体框架部署到Azure时连接字符串添加名称空间

时间:2019-04-10 21:08:53

标签: entity-framework azure deployment entity-framework-6

我正在使用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" />

我认为迁移无法运行,因为它找不到数据库。

如果我手动创建表并删除迁移表创建,则网站将失败,并出现以下情况:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:SQL网络接口,错误:52-无法找到本地数据库运行时安装。

但是,如果编辑web.config并删除“ Utils.Models”。从WebsiteDBContext连接字符串中获取,而不是从WebsiteDBContext_DatabasePublish中获取,它可以正常连接到数据库。

如何正确命名连接并运行迁移?经过努力,但找不到解决方法。

谢谢

2 个答案:

答案 0 :(得分:0)

您的上下文类被命名为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

答案 1 :(得分:0)

最终解决了它。

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

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

当我停止在DBContext中明确命名数据库名称时:

public WebsiteDBContext() : base() 

然后,该应用程序所查找的连接名称是它找到的“ Utils.Models.WebsiteDBContext”。

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