实体框架迁移 - 自动创建表格&更新

时间:2015-07-20 08:23:43

标签: c# entity-framework entity-framework-5

我可能不了解迁移,但我正在更新我的开源应用程序以使用它们。我的目标是

1)当用户第一次使用空白数据库运行应用程序时,应用程序会自动创建表格(并点击我的种子方法以自动填充所需数据)。

2)如果我向我的Entity / Model类添加任何新属性,它们会在数据库时自动添加。

是否可以在不使用Nuget命令的情况下执行此操作?正如我希望这会占用我的许多安装程序代码,以便在首次安装时初始创建表并添加数据。

我有以下设置

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MVCForumContext, Migrations.Configuration>(AppConstants.MvcForumContext));

我的配置类

internal sealed class Configuration : DbMigrationsConfiguration<MVCForumContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = false; 
    }

    protected override void Seed(MVCForumContext context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );

        //TODO - ADD THE INITIAL DATA HERE
    }
}

我使用流畅的API(即。)

正确映射了所有模型类
public class BadgeMapping : EntityTypeConfiguration<Badge>
{
    public BadgeMapping()
    {
        HasKey(x => x.Id);

        Property(x => x.Id).IsRequired();
        Property(x => x.Name).IsRequired().HasMaxLength(50);
        Property(x => x.Description).IsOptional();
        Property(x => x.Type).IsRequired().HasMaxLength(50);
        Property(x => x.Image).IsOptional().HasMaxLength(50);
        Property(x => x.DisplayName).IsRequired().HasMaxLength(50);
        Property(x => x.AwardsPoints).IsOptional();

        // Ignores
        Ignore(x => x.Milestone);
    }
}

同样,我可能会误解。但我创建了一个空白数据库并运行指向数据库的应用程序。

我怀疑是否无法创建包含所有字段的表格?我在这里错过了什么吗?

我一直在针对现有数据库进行开发,为了使其正常运行,我发现了一篇博客文章,概述了使用现有数据库时需要做些什么。

  

只需在包管理器中运行add-migration initial命令即可   控制台窗口,浏览到Migrations文件夹,修改新文件   已经添加,它将包含一个不变的类   DbMigration,有两种方法,Up和Down。如果你删除所有的   方法的内容,但留下方法,然后运行   包管理器控制台中的Update-Database -Verbose命令   会工作的。

所以我已经清除了UP()和Down()方法。如果我把它们放回去,那么我就无法对现有数据库进行操作。

也许只是我认为它会变得比我想象的更聪明。知道创建表格如果需要并根据模型映射自动更新缺失的字段?

1 个答案:

答案 0 :(得分:2)

每次更改模型类时都需要使用add-migration。在将更改新迁移应用于您的数据库后,首次运行应用程序时。通过首次迁移,您的数据库将获取MigrationHistory表,然后将其用于检查已应用的迁移以及需要应用的迁移。