是否可以附加修改初始迁移的索引?

时间:2013-02-26 13:47:07

标签: entity-framework ef-code-first entity-framework-5 ef-migrations

我在我的项目中使用实体框架代码第一种方法。我在包管理器控制台中使用enable-migrations语句创建了模型并启用了迁移。我的上下文类包含映射配置和关系,如

modelBuilder.Configurations.Add(new PostMap());
modelBuilder.Configurations.Add(new UserMap());
我的迁移文件中的

Up方法201302261054023_InitialCreate.cs包含所有表定义,作为我通过DbSet指定的上下文< Type>属性。

我在自定义数据库初始化程序中更改了InitializeDatabase方法,因为我想在数据库初始化期间迁移到特定的迁移。

public void InitializeDatabase(T context)
{
    bool databaseExists = context.Database.Exists();
    if (!databaseExists)
        context.Database.CreateIfNotExists();

    var configuration = new Configuration();
    var migrator = new DbMigrator(configuration);
    migrator.Update("InitialCreate");
}

可以在201302261054023_InitialCreate类中修改Up方法,以便从

添加另一个索引
CreateTable(
        "dbo.City",
        c => new
            {
                Id = c.Int(nullable: false, identity: true),
                Name = c.String(maxLength: 450),
            })
        .PrimaryKey(t => t.Id);

CreateTable(
        "dbo.City",
         c => new
            {
                Id = c.Int(nullable: false, identity: true),
                Name = c.String(maxLength: 450),
            })
        .PrimaryKey(t => t.Id)
        .Index(t=>t.Name,true);

没有附加其他迁移?

2 个答案:

答案 0 :(得分:5)

在挖掘了大量与迁移相关的网页后,我发现修改初始迁移只有在我将数据库更新为“零迁移”(空数据库)时才能帮助我。如果没有迁移到零数据库,我可以添加另一个迁移并在新迁移中创建索引,如

public partial class InitialIndexes : DbMigration
{
    public override void Up()
    {
        CreateIndex("City", "Name", true);
    }

    public override void Down()
    {
        DropIndex("City", new[] {"Name"});
    }
}

答案 1 :(得分:0)

要创建索引,您可以使用ExecuteSqlCommand。

context.Database.ExecuteSqlCommand("CREATE INDEX IX_TableName_ColumnName ON TableName (ColumnName)");

我通常在种子覆盖方法中使用此命令,如下所示。

            protected override void Seed(YourContext context)
            {
                context.Database.ExecuteSqlCommand("CREATE INDEX IX_TableName_ColumnName ON TableName (ColumnName)");
                //...Rest of seed code
             }

您应该可以在方法中使用相同的调用。