EF CodeFirst создать не кластеризованный индекс первичных ключей
-
25-10-2019 - |
Вопрос
Я использую EF 4.1 CodeFirst для создания своего DB. Похоже, что EF создает все первичные ключи с кластерным индексом, что в одном случае не является оптимальным (возможно, больше случаев). Есть ли способ сказать EF генерировать эту таблицу с первичным ключом в качестве не кластеризированного индекса?
Конечно, мы могли бы сделать это вручную, используя пользовательский скрипт после того, как база данных уже создана, но у нас есть много иностранных ключей, указывающих на эту таблицу, это было бы довольно не оптимальным решением, если есть лучший, более простой способ сделать То же самое уже во время создания БД. Любая помощь оценена
Решение
Нет, нет никакого способа контролировать код SQL, который сначала генерирует - это код сначала, и его текущая философия (на самом деле плохая): вы ничего не знаете о базе данных, и вы не беспокоитесь.
Единственный способ изменить это поведение - это написать пользовательский инициализатор базы данных, использовать пользовательские запросы базы данных для поиска созданного индекса, удаления этого индекса и создания нового. Некоторые ссылки:
- Как остановить EF4.1-код, чтобы создать индекс Culstered для объекта PK
- Пользовательский инициализатор с добавлением индекса
- Пример более продвинутого инициализатора
Инициализатор сделает ваше решение зависимым от продукта сервера базы данных бетона.
Другие советы
Да, есть способ указать не создавать кластерные индексы. Если вы используете кодовые миграции, файл *.cs генерируется для заполнения вашей базы данных. В этом файле вы можете указать, кроме первичного ключа, для каждой таблицы, если он должен быть создан с помощью кластерных индексов.
.PrimaryKey(t => t.MID, null, true)