1

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

更新:

配置.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();

        }
4

1 回答 1

2

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

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

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

要关闭行为,请使用:

Database.SetInitializer<YourDatabaseContext>(null);

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

于 2012-09-26T10:02:31.340 回答