听起来好像这是对VS Web部署功能如何处理EFCF迁移一种误解。
通常情况下(非EFCF),VS发布文件到远程服务器,并更新数据库架构。到部署完成时,所有更改都已应用。
随着EFCF迁移,这种情况并非如此。 VS的部署将修改你的web.config来设置数据库所需的连接字符串。这反映在已发布的文件中,但数据库尚未触及。在迁移代码运行之前,数据库的更改不会发生。第一次你的代码初始化你的DbContext时会发生这种情况; DbInitializer将执行任何尚未应用的迁移。通常,这意味着您必须从您的网站请求一个页面才能触发此过程。
来阐述我的评论一点点:
手动更改架构不是一个很好的修复,因为它会接下来是因为能够在以后运行阻止迁移(“表foo已存在“类型错误)。
如果您对与Migrations代码不兼容的数据库进行了更改,则会从EF中获得异常。例如,你可能有这样的迁移:
public override void Up()
{
CreateTable(
"dbo.Foo",
c => new
{
Id = c.Int(nullable: false, identity: true),
Value = c.String(nullable: false, maxLength: 200),
})
.PrimaryKey(t => t.Id);
}
如果你手动创建表foo(例如,因为你没有看到部署后),EF不能再应用此迁移,并抛出一个异常。这可能是您看到的HTTP 500错误的原因。
你能从服务器得到错误吗? EFCF迁移在上下文初始化时运行,因此如果出现错误,它们可能不会运行;或者,他们可能是原因。手动更改模式并不是一个很好的解决方法,因为它会阻止稍后能够运行的迁移(“表Foo已存在”类型错误)。 – Jimmy
我无法获得确切的错误。如果我删除了“Execute Code First Migrations”,那么错误会消失,所以我认为它与初始化有关。 –
设置在视图中显示错误描述的全局错误处理程序(控制器)。该视图将被键入到“@model System.Web.Mvc.HandleErrorInfo”。并显示“@ Model.Exception.Message”。这样你会看到EF发出的确切错误信息。 – erdinger