当前位置 : 主页 > 网络编程 > ASP >

ASP.NET MVC 4 – 应用程序不接受新连接字符串 – AppHarbor Deploy Issue

来源:互联网 收集:自由互联 发布时间:2021-06-24
我目前正在开发一个ASP.NET MVC 4项目,该项目使用Entity Framework 4.3和CodeFirst方法,使用简单的POCO类.另外,我使用SQL Server Express作为开发数据库. 在构建我的类并设置连接字符串之后,我运行了
我目前正在开发一个ASP.NET MVC 4项目,该项目使用Entity Framework 4.3和CodeFirst方法,使用简单的POCO类.另外,我使用SQL Server Express作为开发数据库.

在构建我的类并设置连接字符串之后,我运行了我的项目,它为我生成了一个SQL Server Express数据库,没有任何问题.

但问题是,我正在尝试部署到AppHarbor,我遇到连接字符串问题. AppHarbor要求您将SQL Server安装为“附加组件”,并将连接字符串配置为具有将其Sequilizer连接字符串注入您从GitHub推送的项目的别名.

以下是他们的工作原理:http://support.appharbor.com/kb/add-ons/using-sequelizer

我相信我已正确完成所有这些设置,但我的应用程序如何读取连接字符串似乎存在问题.

这是我在本地计算机上使用的开发连接字符串:

<connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-FranchiseManager-201275154247;Integrated Security=True" 
         providerName="System.Data.SqlClient" />
</connectionStrings>

以下是AppHarbor Sequilizer连接字符串的样子:

<connectionStrings>    
    <add
      name="DefaultConnection"
      connectionString="Server=0691298f-d461-40cc-86d6-a089016ba88d.sqlserver.sequelizer.com;Database=<removed hash value>;User ID=<removed hash value>;Password=<removed hash value>;"
      providerName="System.Data.SqlClient"
    />
  </connectionStrings>

第一个连接 – 由我的EF本地生成 – 工作得很好.第二个 – 由Sequilizer创建 – 我的应用程序没有读取.

但是 – 我可以通过SQL Server Management Studio连接到Sequilizer数据库.所以它一定是我的应用程序吗?

为了解决我的部署到AppHarbor的问题,我将他们的连接字符串硬编码到我的应用程序中,而不是由EF自动生成并在我的本地计算机上进行测试.

这是我做的:

>将Web.config中的连接字符串替换为一个AppHarbor
提供,
>清理解决方案,
>重建解决方案

但是当我运行应用程序时,它仍然使用EF生成的原始数据库 – 这必然意味着它仍然在读取旧的连接字符串.

似乎更改连接字符串是不够的.为了替换连接字符串,我应该更改应用程序中的其他内容?

任何建议表示赞赏 – 谢谢!

编辑

这是我的DbContext类:

public class FranchiseManagerContext : DbContext
    {
        public DbSet<FranchiseSet> FranchiseSets { get; set; }
        public DbSet<Franchise> Franchises { get; set; }

    }

这与名为“DefaultConnection”的连接字符串一样.

在这种情况下,EF如何知道DbContext与连接字符串匹配,但是如果更改字符串的名称,它就无法做到这一点?

UPDATE

我想我从这个答案中知道现在是什么:What is the point of “Initial Catalog” in a SQL Server connection string?

看起来初始目录属性指定了实体框架首次启动时要使用的特定数据库.

您必须指定要加载DbContext的连接字符串的名称.它无法神奇地猜测您希望它使用名为DefaultConnection的那个.有一种启发式方法,如果没有指定名称,它将查找一个连接字符串,其名称设置为从DbContext继承的类的名称. IE浏览器.如果你有:

MyAwesomeDatebase : DbContext

…然后实体框架将开箱即用:

<add name="MyAwesomeDatebase" connectionString="blah" providerName="System.Data.SqlClient" />

……但如果你有:

<add name="DefaultConnection" connectionString="blah" providerName="System.Data.SqlClient" />

…然后它将无法工作,因为实体框架无法知道MyAwesomeDatebase与DefaultConnection一起使用.

要做到这一点,请执行以下操作:

public class MyAwesomeDatebase : DbContext
{
    public MyAwesomeDatebase() : base("DefaultConnection")
}

……而你是金色的.

网友评论