我在我的项目中使用实体框架代码第一种方法。我在包管理器控制台中使用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);
没有附加其他迁移?
答案 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
}
您应该可以在方法中使用相同的调用。