0

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

modelBuilder.Configurations.Add(new PostMap());
modelBuilder.Configurations.Add(new UserMap());

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

我在自定义数据库 Initializer 中更改了 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);

不附加另一个迁移?

4

2 回答 2

5

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

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

    public override void Down()
    {
        DropIndex("City", new[] {"Name"});
    }
}
于 2013-03-05T10:07:48.567 回答
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
             }

您应该能够在您的方法中使用相同的调用。

于 2013-02-28T14:49:55.463 回答