Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 部署到生产主机期间的实体框架代码首次迁移不起作用_Entity Framework_Visual Studio 2013_Entity Framework 6 - Fatal编程技术网

Entity framework 部署到生产主机期间的实体框架代码首次迁移不起作用

Entity framework 部署到生产主机期间的实体框架代码首次迁移不起作用,entity-framework,visual-studio-2013,entity-framework-6,Entity Framework,Visual Studio 2013,Entity Framework 6,我将VS2013与实体框架6.1一起用于SQL 2012 当我首先使用代码在Dev中创建类和表时,它工作得很好。 当我通过Web Deploy发布到我的第三方主机时,所有内容都会部署,但数据库中不会创建任何表。连接字符串包含对数据库具有表创建访问权限的用户的相应用户名和密码。(已测试,因为我通过SSMS使用相同的登录名/密码。) 要在托管的SQL server上成功创建表,请执行以下操作) 数据库发布连接字符串创建正确,并且具有正确的值 当我部署带有“执行代码优先迁移”复选框的ASP.Net M

我将VS2013与实体框架6.1一起用于SQL 2012

当我首先使用代码在Dev中创建类和表时,它工作得很好。 当我通过Web Deploy发布到我的第三方主机时,所有内容都会部署,但数据库中不会创建任何表。连接字符串包含对数据库具有表创建访问权限的用户的相应用户名和密码。(已测试,因为我通过SSMS使用相同的登录名/密码。) 要在托管的SQL server上成功创建表,请执行以下操作) 数据库发布连接字符串创建正确,并且具有正确的值

当我部署带有“执行代码优先迁移”复选框的ASP.Net MVC应用程序时,该应用程序会在托管服务器上抛出500错误


有什么想法可能是错误的吗

听起来这是对VS Web部署功能如何处理EFCF迁移的误解

通常(非EFCF),VS将文件发布到远程服务器并更新数据库架构。部署完成时,所有更改都已应用

对于EFCF迁移,情况并非如此。VS的部署将修改web.config以设置数据库所需的连接字符串。这反映在已发布的文件中,但数据库还没有被触及。在迁移代码运行之前,不会对数据库进行更改。默认情况下,这在代码第一次初始化DbContext时发生;DbInitializer将执行任何尚未应用的迁移。通常,这意味着您必须从站点请求一个页面来触发此过程

关于我的评论,我想解释一下:

手动更改模式并不能很好地解决此问题,因为这样会阻止迁移以后运行(“table Foo已存在”类型错误)

如果您对数据库所做的更改与迁移代码不兼容,您将从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错误的原因。

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

下的
Web.config

<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>
您的
错误
视图(我在
Views\Shared
目录下)将如下所示

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");
    }
}
@{
    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>
}
@{
Layout=“~/Views/Shared/\u Layout\u Blank.cshtml”;
ViewBag.Title=“应用程序错误”;
}
@模型System.Web.Mvc.HandleErrorInfo
应用程序错误
@如果(型号!=null)
{
位置:@Model.ControllerName//@Model.ActionName

消息:@Model.Exception.Message } 其他的 { 您到达此页时出错。 }
出于某种原因,我必须确定已部署的Web.config中添加了一个EntityFramework节,该节不在我的本地版本的Web.config中。错误是由存在EntityFramework节引起的,但没有节描述符指定存在EntityFramework节

我添加了部分描述符,一切正常


我不知道为什么在部署时会发生转换,但转换是不完整的

你能从服务器上得到这个错误吗?EFCF迁移在上下文初始化时运行,因此如果出现错误,它们可能无法运行;或者,他们可能是原因。手动更改架构对此不是一个很好的解决方案,因为这样会阻止迁移以后运行(“table Foo已存在”类型错误)。我还无法获得确切的错误。如果我删除“执行代码优先迁移”,错误就会消失,因此我假设它与初始化有关。设置一个全局错误处理程序(控制器),在视图中显示错误描述。该视图将被键入
@model System.Web.Mvc.HandleErrorInfo
。并显示
@Model.Exception.Message
。通过这种方式,您将看到EF发出的确切错误消息。我理解您语句的视图部分,但我不太清楚如何将控制器设置为全局错误处理程序。你能给我举个例子或进一步的说明吗?我目前已经在项目上安装和配置了Elmah,但无法从中得到任何回复。谢谢,我会在几分钟后发布一个答案。我肯定DbInitializer上出现了错误。我没有对表或数据库进行任何手动更改。事实上,db完全没有我的任何表格。@Jimmy,你能回答一个非常类似的问题吗?好的,现在对我来说有意义了。ThanksOk已经添加了这一点,并在本地对其进行了深入研究,以确保其工作正常。我部署到我的托管服务器,它仍然抛出一个500服务器错误,我从来没有得到这段代码。听起来错误发生在应用程序运行之前。可能是IIS配置或Web.config错误?另外,请检查部署包中是否包含
EntityFramework.SqlServer.dll
。我最近发布应用程序时遇到了一个问题,这个.dll由于某种原因(我使用了EF 6.0.1)不会被包括在内。啊,很棘手。添加该部分是为了设置DbInitializer,以便运行迁移。这就是VS如何确保初始值设定项对于迁移是正确的,而不是使用DropAndCreateAllways,您可能已经为本地开发启用了它。有趣的是,注册该部分应该作为安装EF nugget包的一部分。您是通过Nuget安装的吗?是的,通过Nuget安装的。我将从头开始尝试几个hello world项目,看看问题是否持续存在。我尝试了几个hello world项目,并自动添加了相应的部分,因此问题似乎是异常的。我不理解“添加部分描述符”,但代码,步骤