【问题标题】:seed method works in local machine but not appharbor种子方法适用于本地机器但不适用于appharbor
【发布时间】:2013-07-19 19:11:15
【问题描述】:

我的种子方法在本地机器上运行时运行良好,但是当我将代码推送到 appharbor 时,种子无法正常工作。

这是我的连接字符串:

<connectionStrings>
    <add name="FinalProjectContext" connectionString="Data Source=.\SQLEXPRESS;User
Id=user;Password=pass;initial catalog=MyContextDB;" 
providerName="System.Data.SqlClient" />
</connectionStrings>

我的种子方法在 Configuration 文件中用于迁移:

public Configuration()
{
    AutomaticMigrationsEnabled = true;
    AutomaticMigrationDataLossAllowed = true;
}

protected override void Seed(MyContext context)
{
   //add data
}

我从上下文类中调用我的种子方法,在 OnModelCreating: 内:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
}

编辑

【问题讨论】:

  • AppHarbor 支持 SQLExpress??
  • @JayC 我不知道,但 appharbor 不应该为他们替换我的连接字符串,我只需要在 sql 别名字段中输入我的上下文名称?
  • @SOfanatic 我认为您需要为 MSSQL 服务器设置正确的连接名称并设置“应用程序/插件”(无论 AppHarbor 怎么称呼它)。只有这样他们才会替换连接字符串。对此的快速测试是尝试打印 ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString(使用 Response.Write 或一些控制器/视图)。
  • @Alxandr,我会试试这个并报告,现在我已经添加了我正在使用的插件及其设置的屏幕截图。
  • @SOfanatic 从起始页(底部)转到此处:imgur.com/OAbp6mS。您应该看到连接字符串和连接字符串别名。尝试将连接字符串别名设置为“MyContext”。

标签: c# asp.net-mvc ef-code-first appharbor entity-framework-migrations


【解决方案1】:

经过大量调试、搜索、测试和阅读,问题与 appharbor 无关。该项目使用 DBFactory 作为上下文,这就是问题发生的地方。在我的本地机器上,每次我启动应用程序时,EF 都会调用 Initializer,以便为数据库播种,但为了让它在 app Harbor 中工作,我必须在 DBFactory 构造函数中将 Initializer 设置为 false(显式)。

编辑

问题更进一步。不确定 EF 是如何跟踪这一点的,但我认为如果我在本地运行代码,那么数据库会在本地创建,并且 EF 将迁移标记为“已执行”,因此当我将代码移动到 Appharborit 时不会播种。我发现解决此问题的唯一方法是在本地删除数据库,然后将其推送到 Appharbor。

【讨论】:

    【解决方案2】:

    问题可能是您的连接字符串不是由 AppHarbor 设置的。我不完全确定如何确保它确实如此,但如果你从这里转到 MSSQL-“插件”的配置页面:

    然后将“SQLSERVER_CONNECTION_STRING_ALIAS”设置为您的连接字符串名称(在您的情况下为“MyContext”:

    这应该可以解决问题。

    【讨论】:

      【解决方案3】:

      您的连接字符串名称应与别名相同,即“FinalProjectContext”

      <add name="FinalProjectContext" connectionString="Data Source=.\SQLEXPRESS;UserId=user;Password=pass;initial catalog=MyContextDB;" providerName="System.Data.SqlClient" />
      

      然后 appharbor 会知道将其换成合适的 :)

      【讨论】:

        猜你喜欢
        • 2012-03-16
        • 1970-01-01
        • 2019-07-29
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多