Сначала добавьте индекс с кодом структуры объекта (CTP5) - PullRequest
30 голосов
/ 14 февраля 2011

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

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

Ответы [ 4 ]

31 голосов
/ 14 февраля 2011

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

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

protected override void Seed(EntityMappingContext context)
{
    context.Database.ExecuteSqlCommand("CREATE INDEX IX_NAME ON ...");
}
17 голосов
/ 06 июня 2012

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

Но если вы находитесь в режиме «отладки» / разработки и все время меняете схему и каждый раз воссоздаете базу данных, вы можете использовать пример, упомянутый в ответе Мортезы.

Чтобы сделать это немного проще, я написал очень простой метод расширения, чтобы сделать его строго типизированным, в качестве вдохновения, которым я хочу поделиться со всеми, кто читает этот вопрос и, возможно, также хотел бы этот подход. Просто измените его в соответствии со своими потребностями и способом именования индексов.

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 голосов
/ 28 октября 2012

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

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

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

1 голос
/ 30 октября 2012

Проверьте мой ответ здесь Код Entity Framework First Fluent Api: Добавление индексов к столбцам это позволяет вам определять индексы с несколькими столбцами, используя атрибуты свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...