使用Entity Framework 6,自定义代码优先迁移& CSharpMigrationCodeGenerator

时间:2015-11-30 18:47:16

标签: entity-framework entity-framework-6 ef-migrations

我最近开始使用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

这有意义吗?更重要的是,有没有人对如何进行有任何建议或想法?无论哪种方式,提前谢谢!

1 个答案:

答案 0 :(得分:0)

我正在关闭这个问题。我从来没能完全按照我的想法做到......它不是一个破坏者,我只是希望EF6能够(轻松地)对正在创建的索引名称施加控制。

IIRC,我做了 @ steve-greene 建议,并使用Sql()方法手动指定了索引的名称。