0

我创建了一个 Visual Studio 2012 MVC4 应用程序。我正在通过右键单击项目并选择发布来测试“发布”功能。我按照这里的说明进行操作。我可以连接到远程 Web 服务器,并且由于某种原因,文件夹被发布到正确的文件夹,但内容文件夹除外。

当我运行浏览到远程 Web 服务器时,它会提示我登录,因此应用程序正在运行。然而,迁移从未发生过。创建的唯一表是 simplemembership 表,所以我知道 Web 服务器正在连接到远程数据库服务器。没有创建其他表,也没有运行种子方法。我播种角色和默认用户。

我选中了发布设置中“执行代码优先迁移(在应用程序启动时运行)”的框

在我的 localdb 连接字符串上一切正常以进行本地测试。当我发布到实时站点时,只是无法弄清楚如何从现有迁移和种子中创建数据库,请注意我只会播种一次。有没有办法指定再次运行哪些迁移?我可以复制迁移并在数据库服务器上运行,但为什么需要额外的步骤?

编辑:将 database.setinilizer 添加到我的上下文时,我现在收到一个错误,说我的 userprofile 表中的某些字段不存在,我使用简单的成员资格。此错误发生在 Web 发布后的第一个页面加载时,然后在继续页面加载时出现错误“WebSecurity.InitializeDatabaseConnection”方法只能调用一次。

但是,它现在确实创建了我的 simplemembership 表,但我对所有其他表的迁移从未运行,这就是为什么我缺少额外的用户配置文件字段。

编辑: 基本上我没有在调用 WebSecurity.InitializeDatabaseConnection 之前检查网络安全是否已初始化,以便解决该问题。现在我让它部分工作。该应用程序可以很好地创建 simplemembership 表,但是由于我将表添加到 UserProfile 表中,因此在更改它们之前我无法播种。因此,我手动创建了 userprofile 表并让应用程序创建其余的表。然后我在初始迁移中注释掉 userprofile 表。在此之后,当我登录时,它将创建我的其余表格。

开放的问题是如何让我的数据库迁移在 simplemembership 初始化之前运行?

4

2 回答 2

2

要在远程服务器上进行迁移工作,您需要首先在 Context 类中添加使用 SetInitializer :

        static MyDatabaseContext()
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyProjectContext, Migrations.Configuration>());
        }

在您的迁移配置中,您需要添加以下代码:

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

我没有选择“执行代码优先迁移(在应用程序启动时运行)”,并且在 MyProjectContext 中设置初始化之后,它会为我执行迁移。如果您已在此处完成,为了播种您的数据,您可以在 Migration 配置类中执行以下操作:

      protected override void Seed(MyProject.Models.MyProjectContextcontext)
        {               
          DoSeed(context);               
        }

        private void DoSeed(MyProjectContext context)
        {
          var users = new List<User>
          {
            new Site { UserId = 1, Name = "TestUser", IsDeleted = false },
            new Site { UserId = 2, Name = "TestUser2", IsDeleted = false }
          };
            users.ForEach(s => context.Users.AddOrUpdate(s));
            context.SaveChanges();
}

我没有在部署配置文件上选择“执行代码优先迁移(在应用程序启动时运行)”。有关这方面的更多详细信息,请参见:

这个链接这个链接

希望这会有所帮助(因为它对我有用),否则请在部署应用程序时添加任何错误。

于 2013-05-03T00:14:37.513 回答
1

我认为问题是,因为只要您没有尝试访问数据或从站点/站点中创建任何需要连接到数据库的数据,迁移和播种将不会运行“以及运行的原因登录站点后在您的站点上迁移,可能是因为您的站点需要在所有页面中获得授权,或者您要在其中查看数据的页面。如果您有页面示例主页,则没有授权访问页面,您将看到该页面,如果在此页面中有一些数据需要从数据库中获取,您可能会看到迁移运行。我从这个Deploy it to IIS 中找到了这个,但不确定是不是这个原因。如果您浏览包含数据且此数据访问不需要身份验证的主页,如果您的迁移仍未运行,请告诉我。

于 2013-05-11T12:13:23.207 回答