首先使用实体​​框架代码添加索引(CTP5)

时间:2011-02-14 18:07:28

标签: entity-framework

有没有办法让EF CTP5在创建模式时创建索引?

更新:有关EF 6.1如何处理此问题,请参阅here(如下面juFo所述)。

4 个答案:

答案 0 :(得分:31)

您可以在 Database 类上利用新的CTP5的 ExecuteSqlCommand 方法,该方法允许对数据库执行原始SQL命令。

为此目的调用SqlCommand方法的最佳位置是在自定义Initializer类中重写的Seed方法内部。例如:

protected override void Seed(EntityMappingContext context)
{
    context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
}

答案 1 :(得分:17)

正如Mortezas的评论中提到的那样,如果您使用迁移,则会有一个CreateIndex / DropIndex方法。

但是如果您处于“调试”/开发模式并且一直在更改模式,并且每次都可以使用Morteza答案中提到的示例重新创建数据库。

为了使它更容易一点,我写了一个非常简单的扩展方法,使其强烈打字,作为我希望与阅读此问题的任何人分享的灵感,也许也想要这种方法。只需更改它以符合您的需求和命名索引的方式。

You use it like this: context.Database.CreateUniqueIndex<User>(x => x.Name);

    public static void CreateUniqueIndex<TModel>(this Database database, Expression<Func<TModel, object>> expression)
    {
        if (database == null)
            throw new ArgumentNullException("database");

        // Assumes singular table name matching the name of the Model type

        var tableName = typeof(TModel).Name;
        var columnName = GetLambdaExpressionName(expression.Body);
        var indexName = string.Format("IX_{0}_{1}", tableName, columnName);

        var createIndexSql = string.Format("CREATE UNIQUE INDEX {0} ON {1} ({2})", indexName, tableName, columnName);

        database.ExecuteSqlCommand(createIndexSql);
    }

    public static string GetLambdaExpressionName(Expression expression)
    {
        MemberExpression memberExp = expression as MemberExpression;

        if (memberExp == null)
        {
            // Check if it is an UnaryExpression and unwrap it
            var unaryExp = expression as UnaryExpression;
            if (unaryExp != null)
                memberExp = unaryExp.Operand as MemberExpression;
        }

        if (memberExp == null)
            throw new ArgumentException("Cannot get name from expression", "expression");

        return memberExp.Member.Name;
    }

更新:从版本6.1开始,可以使用[Index]属性。

有关详细信息,请参阅http://msdn.microsoft.com/en-US/data/jj591583#Index

答案 2 :(得分:2)

此功能应该在不久的将来通过数据注释和Fluent API提供。微软已将其添加到他们的公共积压中:

http://entityframework.codeplex.com/workitem/list/basic?keywords=DevDiv [Id=87553]

在此之前,您需要在自定义Initializer类上使用种子方法来执行SQL以创建唯一索引,如果您使用的是代码优先迁移,请创建新的迁移以添加唯一索引,并使用CreateIndexDropIndex方法中的UpDown方法进行迁移,以创建和删除索引。

答案 3 :(得分:1)

在此处检查我的答案Entity Framework Code First Fluent Api: Adding Indexes to columns这允许您通过使用属性上的属性来定义多列索引。