2014-01-30 113 views
0

我使用VS2013对SQL 2012实体框架代码优先迁移部署到生产主机不与实体框架6.1工作

当我使用的代码先创建我的类和表在开发它正常工作期间。 当我通过Web部署发布到我的第三方主机时,所有部署都已部署,但在数据库中未创建任何表。连接字符串包含具有表创建权限的用户的相应用户名和密码。 (经过测试,因为我通过SSMS 使用相同的登录名/密码成功在托管SQL服务器上创建表) 数据库发布连接字符串正确设置且具有正确的值。

当我部署ASP.Net MVC应用程序与执行代码首先迁移复选框打上应用程序托管服务器上抛出一个500错误。

什么可能是错有什么想法?

+0

你能从服务器得到错误吗? EFCF迁移在上下文初始化时运行,因此如果出现错误,它们可能不会运行;或者,他们可能是原因。手动更改模式并不是一个很好的解决方法,因为它会阻止稍后能够运行的迁移(“表Foo已存在”类型错误)。 – Jimmy

+0

我无法获得确切的错误。如果我删除了“Execute Code First Migrations”,那么错误会消失,所以我认为它与初始化有关。 –

+0

设置在视图中显示错误描述的全局错误处理程序(控制器)。该视图将被键入到“@model System.Web.Mvc.HandleErrorInfo”。并显示“@ Model.Exception.Message”。这样你会看到EF发出的确切错误信息。 – erdinger

回答

1

出于某种原因,我必须确定有加,这不是设在我的web.config的本地版本的部署Web.config文件的部分的EntityFramework。该错误是由EntityFramework部分引起的,但没有部分描述符指定存在EntityFramework部分。

我添加了段描述符,并且一切正常。

我不确定为什么当部署事物时转换发生,但转换不完整。

+0

啊,棘手。添加该部分以设置DbInitializer以启用Migrations运行。这就是VS如何确保初始化器正确地进行迁移,而不是像使用DropAndCreateAlways那样可能已经启用了本地开发。 – Jimmy

+0

虽然很有趣,但注册该部分应该是安装EF块组件的一部分。你是否通过Nuget安装? – Jimmy

+0

是的,通过Nuget。我将从头开始尝试几个你好的世界项目,看看问题是否持久。 –

1

听起来好像这是对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错误的原因。

+0

我认为错误是在DbInitializer上发布的。我没有对表或数据库进行任何手动更改。事实上,数据库完全没有我的任何表格。 –

0

我会在你的应用程序中设置错误页面。

在你Web.config<system.web>你会

<customErrors mode="On" defaultRedirect="~/Error/Index"> 
    <error statusCode="400" redirect="~/Error/Error400" /> 
    <error statusCode="403" redirect="~/Error/Error403" /> 
    <error statusCode="404" redirect="~/Error/Error404" /> 
</customErrors> 

因此,defaultRedirect会赶上500错误。

Error控制器可以看看如下。

public class ErrorController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View("Error"); 
    } 

    public ActionResult Error400() 
    { 
     return View("Error400"); 
    } 

    public ActionResult Error403() 
    { 
     return View("Error403"); 
    } 

    public ActionResult Error404() 
    { 
     return View("Error404"); 
    } 
} 

而且你Error视图(我有它在Views\Shared目录)看起来竟被如下。

@{ 
    Layout = "~/Views/Shared/_Layout_Blank.cshtml"; 
    ViewBag.Title = "Application Error"; 
} 

@model System.Web.Mvc.HandleErrorInfo 

<h1>Application Error</h1> 
@if (Model != null) 
{ 
    <div> 
     Location: @Model.ControllerName/@Model.ActionName 
    <br /> 
     Message: @Model.Exception.Message 
    </div> 
} 
else 
{ 
    <div> 
     You've reached this page in error. 
    </div> 
} 
+1

好吧现在对我有意义。谢谢 –

+0

好吧,已经添加了这个,并通过本地步骤,看看它的工作原理。我部署到我的托管服务器,它仍然会引发500服务器错误,我永远不会得到这个代码。 –

+0

声音在应用程序运行之前发生错误。它可能是IIS配置或Web.config错误?另外,你能否检查一下'EntityFramework.SqlServer.dll'是否包含在你的部署包中。我最近在发布应用程序时遇到了问题,并且由于某些原因(我使用EF 6.0.1)不会包含此.dll。 – erdinger