Как остановить EF4.1 Code-First для создания индекса Culstered для объекта PK

С помощью следующего простого класса сущностей EF4.1 Code-First создаст кластеризованный индекс для столбца PK UserId при инициализации базы данных.

    public class User
    {
        [Key]
        public int UserId { get; set; }
        public int AppId  { get; set; }
        public string UserName { get; set; }
    }

В целях повышения производительности мои цели проектирования заключаются в том, чтобы сгенерированная таблица Users была физически кластеризована в соответствии с столбцом AppId, а не PK.

В моем классе Initializer я попытался вручную удалить автоматически сгенерированный кластерный индекс PK и создать любой кластерный индекс, который мне нужен, но здесь нет никакой подсказки, чтобы предсказать автоматически сгенерированное имя PK__Users__25518C17 для индекса!

Я новичок в мире Code-First и действительно не знаю, есть ли обходной путь для моих целей дизайна.

заранее спасибо


person Hossam    schedule 28.04.2011    source источник


Ответы (1)


Вам не нужно предсказывать имя автоматически сгенерированного индекса. Вам просто нужно выбрать имя индекса. Для SQL-сервера вы можете использовать запрос, например:

SELECT I.Name
FROM sys.indexes AS I
INNER JOIN sys.tables AS T ON
    I.object_Id = T.object_Id
WHERE I.is_primary_key = 1 
    AND T.Name = 'Users'

Как только вы получите имя в своем пользовательском инициализаторе, вы можете изменить старый индекс и создать новый.

person Ladislav Mrnka    schedule 28.04.2011
comment
Большое спасибо, это очень помогло мне продолжить мой подход. но позже я узнал, что мне нужно удалить/воссоздать каждый индекс/связь, чтобы сгруппировать таблицу пользователей в AppId. - person Hossam; 30.04.2011
comment
Очень болезненный подход в реальных приложениях!! Без аннотаций, таких как [Key(NonClustered)] или [Index(Clustered)] и без пользовательских соглашений, проектирование сначала базы данных, а затем кода — это мой путь! по-прежнему открыты для предложений или подсказок. Еще раз спасибо. - person Hossam; 30.04.2011
comment
Хоссам, я действительно думаю, что ты пришел к правильному выводу. Генерация БД действительно предназначена только для неопределенных схем в простых приложениях, которые могут быть A) сгенерированы для любого источника данных - даже настраиваемого и B) просты. Поскольку не все системы хранения данных даже знают, что такое кластеризованный индекс, EF, вероятно, даже не будет с ним разбираться... значит, вам определенно пора управлять собственной схемой. Использование проекта БД будет означать, что вы можете импортировать сгенерированную БД и очень легко ее настроить. - person Gats; 30.04.2011