2011-07-25 12 views
9

Estoy usando EF 4.1 CodeFirst para crear mi base de datos. Parece que EF está creando todas las claves primarias con índice agrupado, lo que no es óptimo para nosotros en un caso (posiblemente más casos). ¿Hay alguna forma de decirle a EF que genere esta tabla con la clave principal como un índice no agrupado?EF CodeFirst crear índice de clave principal no agrupado

Por supuesto que podríamos hacerlo manualmente usando una secuencia de comandos personalizada una vez creada la base de datos, pero tenemos muchas claves externas apuntando a esta tabla, sería una solución bastante no óptima si hay una mejor, más recta seguir adelante para hacer lo mismo ya durante la creación de DB. Cualquier ayuda apreciada

+2

IMO esta es la razón por la cual DB First fue inventada. – Tridus

+0

@Tridus, afaik Modelo Primero fue "primero" :) y por supuesto con modelo primero sería pan comido, pero Code First tiene ventajas que me parecen "más bonitas/más limpias", aunque ahora está muy lejos de ser perfecto como se ve también en este ejemplo aquí. Lo llamaría falta de personalización suministrada hasta ahora. – petho

+0

Es más limpio, excepto cuando no lo es. :) Para cosas como esta DB First es realmente agradable porque simplemente haces lo que sea necesario hacer en el lado de la base de datos, y luego le dices a EF "hey generar algunos POCOs de eso". Realmente no hay ninguna razón por la cual EF o su código necesiten saber algo sobre qué tipo de índices se utilizan en el lado del servidor. – Tridus

Respuesta

13

No hay forma de controlar el código SQL primero genera - primero es el código y su filosofía actual (la mala en realidad) es: usted no sabe nada de la base de datos y no se molesta.

La única forma de cambiar este comportamiento es escribir un inicializador de base de datos personalizado, usar consultas personalizadas de bases de datos para buscar el índice creado, eliminar ese índice y crear uno nuevo. Algunas referencias:

El initilizer harán dependientes de su solución en el producto de servidor de base de datos concreta.

+0

@LadislawMmka. "El iniciador hará que su solución dependa del producto de servidor de base de datos concreto". - este es solo el caso si lo escribe para un producto específico. No hay ninguna razón por la cual esto deba restringirse a un proveedor en particular. Creo que lo que realmente quieres decir es "esto probablemente sea ...". –

9

Sí, hay una manera en que puede especificar no crear índices agrupados. Si usa migraciones de código, se genera un archivo * .cs para llenar su DataBase. En este archivo, puede especificar aparte de la clave principal para cada tabla, si necesita crearse con índices agrupados.

.PrimaryKey(t => t.MID, null, true) 
+1

Esta es la forma más fácil de lograr un índice no agrupado en la versión actual. Requiere el uso de migraciones de código. – jbeanky

+0

El método PrimaryKey ni siquiera existe en EF 6.1 – Triynko

+0

@triynko Verá que se llama encadenado después del método CreateTable en la primera clase de migración del código que se genera para la creación de una tabla. El método está en la clase TableBuilder en el espacio de nombres System.Data.Entity.Migrations.Builders. – Josh

Cuestiones relacionadas