Phi*_*egg 3 asp.net asp.net-mvc entity-framework entity-framework-4.1 appharbor
我目前正在开发一个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>
Run Code Online (Sandbox Code Playgroud)
以下是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>
Run Code Online (Sandbox Code Playgroud)
第一个连接 - 由我的EF本地生成 - 工作得很好.第二个 - 由Sequilizer创建 - 我的应用程序没有读取.
但是 - 我可以通过SQL Server Management Studio连接到Sequilizer数据库. 所以它一定是我的应用程序吗?
为了解决我的部署到AppHarbor的麻烦,我将他们的连接字符串硬编码到我的应用程序中,而不是由EF自动生成并在我的本地计算机上进行测试.
这是我做的:
但是当我运行应用程序时,它仍然使用EF生成的原始数据库 - 这必然意味着它仍然在读取旧的连接字符串.
似乎更改连接字符串是不够的.为了替换连接字符串,我应该更改应用程序中的其他内容?
任何建议表示赞赏 - 谢谢!
编辑
这是我的DbContext类:
public class FranchiseManagerContext : DbContext
{
public DbSet<FranchiseSet> FranchiseSets { get; set; }
public DbSet<Franchise> Franchises { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这与名为"DefaultConnection"的连接字符串一样.
在这种情况下,EF如何知道DbContext与连接字符串匹配,但是如果更改字符串的名称,它就无法做到这一点?
UPDATE
我想我从这个答案中知道现在是什么: SQL Server连接字符串中"初始目录"的重点是什么?
看起来初始目录属性指定了实体框架首次启动时要使用的特定数据库.
fri*_*ism 13
您必须指定要加载DbContext的连接字符串的名称.它无法神奇地猜测你希望它使用被调用的那个DefaultConnection.有一种启发式方法,如果没有指定名称,它将寻找一个连接name字符串,其设置为继承自的类的名称DbContext.IE浏览器.如果你有:
MyAwesomeDatebase : DbContext
Run Code Online (Sandbox Code Playgroud)
...然后实体框架将开箱即用:
<add name="MyAwesomeDatebase" connectionString="blah" providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)
......但如果你有:
<add name="DefaultConnection" connectionString="blah" providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)
...然后它将无法工作,因为实体框架无法知道这MyAwesomeDatebase一点DefaultConnection.
要做到这一点,请执行以下操作:
public class MyAwesomeDatebase : DbContext
{
public MyAwesomeDatebase() : base("DefaultConnection")
}
Run Code Online (Sandbox Code Playgroud)
......而你是金色的.
| 归档时间: |
|
| 查看次数: |
9922 次 |
| 最近记录: |