我创建了一个visual studio 2012 MVC4应用程序。我正在通过右键单击项目并选择发布来测试“发布”功能。我按照here的说明进行操作。我可以连接到远程Web服务器,文件夹由于某种原因发布到正确的文件夹,但内容文件夹除外。
当我运行浏览到远程Web服务器时,它会提示我登录,以便应用程序正常运行。然而,迁移从未发生过。创建的唯一表是simplemembership表,所以我知道Web服务器正在连接到远程数据库服务器。没有创建其他表,并且种子方法不会运行。我为角色和默认用户播种。
我在发布设置中选中了“执行代码优先迁移(在应用程序启动时运行)”的复选框
我的localdb连接字符串上的所有内容都可以正常进行本地测试。我发布到实时网站时,无法弄清楚如何从现有的迁移和种子创建数据库,请注意我只播种一次。有没有办法指定再次运行哪些迁移?我可以复制迁移并在数据库服务器上运行,但为什么还有额外的步骤?
编辑: 将database.setinilizer添加到我的上下文时,我现在收到错误,说我的userprofile表中的某些字段不存在,我使用简单的成员资格。 Web发布后第一页加载时出现此错误,然后在继续页面加载时出现错误“WebSecurity.InitializeDatabaseConnection”方法只能调用一次。
HOwever,它现在确实创建了我的简单会员表,但我对所有其他表的迁移从未运行,这就是为什么我缺少其他用户配置文件字段。
修改 基本上我没有在调用WebSecurity.InitializeDatabaseConnection之前检查是否初始化了websecurity,以便解决该问题。现在我部分工作了。该应用程序创建简单的成员表,但由于我将表添加到UserProfile表,我不能播种,直到我更改它们。因此,我手动创建userprofile表并让应用程序创建其余表。然后我在初始迁移中注释掉了userprofile表。在此之后,当我登录时,它将创建我的其余表。
开放式问题是如何让我的数据库迁移在简单成员资格初始化之前运行?
答案 0 :(得分:2)
要在远程服务器上进行迁移,您需要首先在Context类中添加使用SetInitializer:
static MyDatabaseContext()
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyProjectContext, Migrations.Configuration>());
}
在迁移配置中,您需要添加以下代码:
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
}
我没有选择“执行代码优先迁移(在应用程序启动时运行)”,并且在MyProjectContext中设置初始化之后,它会为我进行迁移。 如果您已经在这里完成了数据,那么您可以在迁移配置类中执行以下操作:
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();
}
我没有在部署配置文件中选择“执行代码优先迁移(在应用程序启动时运行)”。 有关详细信息,请参阅:
希望这有帮助(因为它对我有用),否则请在部署应用程序时添加任何错误。
答案 1 :(得分:1)
我认为问题是,因为只要您没有尝试访问数据 或者从站点/站点创建任何数据,这需要连接到数据库,迁移和播种 不会跑“ 登录网站后,在您的网站上运行迁移的原因, 是因为您的网站需要在所有页面或您想要的页面中获得授权 查看数据。 如果您有页面示例主页,则不授权访问该页面, 您将看到该页面,如果在此页面中有一些需要从中获取的数据 数据库,您可能会看到迁移运行。 我从Deploy it to IIS找到了这个,但不确定是不是这个原因。 如果您浏览主页,请告知我您的迁移是否仍未运行 此数据访问需要数据和身份验证。