0

我在我的项目中使用实体框架代码的第一种方法。我已经使用包管理器控制台中的enable-migrations语句创建了模型并启用了迁移。如通过DbSet <类型>属性指定我的情况下我的上下文类包含映射配置和像是否可以附加索引修改初始迁移?

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

最多的方法在我的迁移文件201302261054023_InitialCreate.cs关系包含所有表定义。

我更改了自定义数据库初始化程序中的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类从

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); 

而不附加其他迁移?

回答

5

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

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

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

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

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

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

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

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

+0

古贝,感谢您的回答。我的问题没有得到适当的描述。我想使用迁移来管理索引。你的方法应该是功能性的,但只适用于数据库迁移到最新版本的情况。我需要使用迁移到比最新版本更旧的数据库创建索引。 – 2013-03-06 08:55:18