3

我目前正在使用实体框架4.3与CodeFirst方法使用简单的POCO类的ASP.NET MVC 4项目。另外,我使用SQL Server Express作为开发数据库。ASP.NET MVC 4 - 应用程序不接受新的连接字符串 - AppHarbor Deploy问题

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

虽然这个问题,我正在尝试部署到AppHarbor,我遇到了连接字符串的问题。 AppHarbor要求您将SQL Server安装为'Add-On'并将连接字符串配置为具有别名,以便将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在这种情况下连接字符串匹配,但是如果你改变了字符串的名称不能做呢?

UPDATE

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

它看起来像初始目录属性指定特定的数据库时,实体框架的第一个踢使用

+0

该帐户是否具有数据库创建权限? – 2012-07-19 18:47:24

+0

你得到的错误是什么? – 2012-07-19 18:48:09

+0

检查连接字符串是否被上下文使用,并且它没有硬编码,如果它被部署,请检查服务器上的webconfig以确保它是正确的。 – 2012-07-19 18:52:57

回答

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" /> 

..那么它将无法工作,因为Entity Framework无法知道MyAwesomeDatebaseDefaultConnection一起使用。

为了使这项工作,做到这一点:

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

...,你是金色的。

+0

好吧,这是很好的信息谢谢!有一个问题 - 为什么当我用EF(我的开发环境)创建我的数据库的第一个实例时,我不需要这样做?我只需要提供连接字符串 - 没有其他配置。我将在EDIT下的原始文章中添加我的上下文类作为示例。 – PhillipKregg 2012-07-20 02:50:59

+0

没关系 - 我刚才发现在原始连接字符串中,有一个'初始目录'属性指定要使用的数据库。对不起所有的问题 - 我正在学习这个东西,所以有很多要弄清楚。再次感谢! – PhillipKregg 2012-07-20 03:33:46

0

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

我无法在AppHarbor文档中的任何位置找到它(可能它是.net mvc特有的东西?),但连接字符串必须与我的DbContext类具有相同的名称。

我在SO上发现了一些其他问题,从而发现了一些提示。

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

  1. 一定要在Web.config中的ConnectionString的name属性是相同的名称作为您的DbContext类
  2. 提交和推送该项目您的回购
  3. 确保在AppHarbor别名是同一名称的连接字符串
  4. 部署后第3步上应用港口新的版本(这是必要的,以获取新的连接字符串名称)

这样做后,我的应用程序拿起Sequilizer数据库,它现在工作正常。

+0

这不是一个AppHarbor特定的问题。如果不指定连接字符串名称实体框架代码首先会查找与继承'DbContext'的类具有相同名称的实体。 – friism 2012-07-19 23:35:37

+0

正如您在上面的代码片段中看到的,我确实指定了连接字符串名称。但是Sequilizer字符串只有在名称与DbContext匹配时才会起作用 - 无论我是否拥有其他名称。关于这个问题可能会有什么想法?如果有更好的解决方案,我愿意接受不同的方式。 – PhillipKregg 2012-07-20 00:34:33

+0

查看完整答案:http://stackoverflow.com/a/11572020/2942 – friism 2012-07-20 02:26:39