3

我目前正在开发一个 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 自动生成并在我的本地机器上测试的连接字符串。

这是我所做的:

  1. 用提供的 AppHarbor 替换了 Web.config 中的连接字符串,
  2. 清洗溶液,
  3. 重建解决方案

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

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

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


编辑


这是我的 DbContext 类:

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

    }

这适用于名为“DefaultConnection”的连接字符串。

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

更新

我想我从这个 SO 答案中知道它现在是 什么: SQL Server 连接字符串中的“初始目录”有什么意义?

看起来 Initial Catalog 属性指定了在 Entity Framework 首次启动时要使用的特定数据库。

4

2 回答 2

13

您必须指定您希望 DbContext 加载的连接字符串的名称。它无法神奇地猜测您希望它使用名为DefaultConnection. 有一个启发式表示,如果没有指定名称,它将寻找一个连接字符串,并将其name设置为继承自的类的名称DbContext。IE。如果你有:

MyAwesomeDatebase : DbContext

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

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

...但如果你有:

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

...那么它将无法工作,因为实体框架无法知道MyAwesomeDatebaseDefaultConnection.

要使其工作,请执行以下操作:

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

......你是金色的。

于 2012-07-20T02:26:25.793 回答
0

好的,我想我终于得到了这个工作。

我在 AppHarbor 文档的任何地方都找不到它(也许它是特定于 .net mvc 的东西?),但连接字符串必须与我的 DbContext 类同名。

通过查看有关 SO 的其他一些问题,我找到了一些提示。

对于可能遇到相同问题的其他任何人:

  1. 确保 Web.config 中 ConnectionString 的 name 属性与您的 DbContext 类同名
  2. 提交项目并将其推送到您的仓库
  3. 确保 AppHarbor 上的别名名称与您的连接字符串相同
  4. 在第 3 步之后在 app Harbor 上部署新构建(这是获取新连接字符串名称所必需的)

之后,我的应用程序获取了 Sequilizer 数据库,现在可以正常工作了。

于 2012-07-19T21:28:54.347 回答