我最近开始使用Entity Framework 6的代码优先自定义迁移。它运行良好,但我想做的一件事是在尝试重命名索引时生成一对CreateIndex()
和DropIndex()
语句,而不是使用{{1}像默认的RenameIndex()
想要的那样。
例如,我目前在流畅的映射中使用数据注释来重命名这样的索引:
CSharpMigrationCodeGenerator
这里的问题是,默认情况下,当我添加新迁移以捕获对模型的此更改时,EF6想要生成以下代码:
Property(x => x.TeacherId).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Students_TeacherId")));
但我真正需要EF6来生成的是:
using System;
using System.Data.Entity.Migrations;
namespace MyApp.Migrations
{
public partial class RenameIndexTest : DbMigration
{
public override void Up()
{
// BAD: [RenameIndex] will generate a "EXEC sp_rename" statement.
RenameIndex(table: "dbo.Students", name: "IX_TeacherId", newName: "IX_Students_TeacherId");
}
public override void Down()
{
RenameIndex(table: "dbo.Students", name: "IX_Students_TeacherId", newName: "IX_TeacherId");
}
}
}
我们的数据团队强烈要求开发人员在重命名索引时使用T-SQL using System;
using System.Data.Entity.Migrations;
namespace MyApp.Migrations
{
public partial class RenameIndexTest : DbMigration
{
public override void Up()
{
// GOOD: We generate separate SQL statements to drop & add the index.
DropIndex(table: "dbo.Students", name: "IX_TeacherId");
CreateIndex(table: "dbo.Students", name: "IX_Students_TeacherId", column: "TeacherId");
}
public override void Down()
{
DropIndex(table: "dbo.Students", name: "IX_Students_TeacherId");
CreateIndex(table: "dbo.Students", name: "IX_TeacherId", column: "TeacherId");
}
}
}
/ DROP
语句。到目前为止,我还没有找到一种方法来覆盖CREATE
语句的行为,使用使用RenameIndex()
作为其基类的自定义类,因为{{1} } class没有关于已创建索引的列的任何信息。
就我自己而言:
CSharpMigrationCodeGenerator
这有意义吗?更重要的是,有没有人对如何进行有任何建议或想法?无论哪种方式,提前谢谢!
答案 0 :(得分:0)
我正在关闭这个问题。我从来没能完全按照我的想法做到......它不是一个破坏者,我只是希望EF6能够(轻松地)对正在创建的索引名称施加控制。
Sql()
方法手动指定了索引的名称。