Подтвердить что ты не робот

Сначала добавить индекс с кодом структуры сущности (CTP5)

Есть ли способ получить EF CTP5 для создания индекса при создании схемы?

Обновление: Смотрите здесь, как это делает EF 6.1 (как указано juFo ниже.)

4b9b3361

Ответ 1

Вы можете использовать новый метод ExecuteSqlCommand CTP5s в классе Database, который позволяет выполнять необработанные команды SQL в отношении базы данных.

Лучшим местом для вызова метода SqlCommand для этой цели является метод Seed, который был переопределен в пользовательском классе Initializer. Например:

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

Ответ 2

Как упоминалось в комментариях к Мортезасу, существует ответ на метод CreateIndex/DropIndex, если вы используете миграции.

Но если вы находитесь в режиме "debug" /development и постоянно меняете схему и воссоздаете базу данных каждый раз, когда можете использовать пример, упомянутый в 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

Ответ 3

Эта функция должна быть доступна в ближайшем будущем через аннотации данных и Fluent API. Microsoft добавила его в свой общий журнал:

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

До тех пор вам понадобится использовать метод seed в пользовательском классе Initializer для выполнения SQL для создания уникального индекса, а если вы используете первые миграции кода, создайте новую миграцию для добавления уникального индекса, и используйте методы CreateIndex и DropIndex в ваших методах Up и Down для миграции для создания и удаления индекса.