【问题标题】:Entity Framework 5 delete my database changing modelEntity Framework 5 删除我的数据库更改模型
【发布时间】:2012-09-26 09:43:06
【问题描述】:

我有一个带有 Entity Framework 5、.NET 4.5 和 Visual Studio 2012 的 ASP.NET MVC 4 项目。 在我的解决方案中,我将所有模型放在一个名为 Model 的项目中,将所有存储库和我的 DbContext 放在另一个名为 Data 的项目中。 我使用 Enable-Migrations 命令激活 Data 项目中的迁移。我决定手动处理它们。如果我使用 Add-Migration 命令创建一个新的迁移,一切都会很好。例如,如果我向表中添加一个新列,它就可以正常工作。我可以在数据库架构中看到新列,并且在 _MigrationHistory 表中看到新记录。 此时,随着新列的创建,我需要将此列添加到正确的模型中。所以,我将此方法添加到我的代码优先模型类中并运行该项目。 它删除我的数据库,并使用初始迁移对其进行初始化。 我无法在不丢失所有数据的情况下调整模型。 我怎样才能避免这种行为? 谢谢

更新:

配置.cs

namespace NegoziazioneEventi.Data.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<NegoziazioneEventi.Data.NeDataContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(NegoziazioneEventi.Data.NeDataContext context)
        {

        }
    }
}

Global.asax 中的Application_Start()

protected void Application_Start()
        {

            // init basic data on database
            System.Data.Entity.Database.SetInitializer(new Models.InitData());

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            _container = Bootstrapper.GetWindsorContainer();

        }

【问题讨论】:

  • 您可以从 Migrations 文件夹中发布您的 Configuration.cs 代码并从 Global.asax 中发布 Application_Start 方法吗?
  • 我已将它们发布在问题中。谢谢

标签: asp.net-mvc database entity-framework visual-studio-2012 entity-framework-migrations


【解决方案1】:

我决定手动处理它们。如果我使用 Add-Migration 命令创建一个新的迁移,一切都会很好。 ... 此时,随着新列的创建,我需要将此列添加到正确的模型中。因此,我将此方法添加到我的代码优先模型类中并运行该项目。

这是对迁移的完全错误使用,这也是 EF 删除数据库的原因。您必须首先将属性添加到模型,然后添加迁移,因为 EF 需要将正确的数据存储到 _MigrationHistory 表中,以将该记录与该迁移的真正含义相匹配。

使用您当前的方法,EF 运行应用程序并检查 _MigrationHistory 表,但表中的记录不包含有关您新添加的属性的信息,因此 EF 认为对您的模型进行了新更改并使用默认策略删除数据库并创建一个反映您当前模型的新数据库。您可以关闭此行为,但您应该从正确使用迁移开始!

要关闭行为,请使用:

Database.SetInitializer<YourDatabaseContext>(null);

您正在使用自己的初始化程序,这很可能源自错误的内置初始化程序,导致当前数据库丢失。

【讨论】:

  • 非常感谢。我找不到关于实体框架的完整参考文档,所以我在没有知识的情况下尝试。
  • 如果有人需要关于如何进行迁移的教程:asp.net/web-forms/tutorials/deployment/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多