2012-08-30 15 views
7

Estoy utilizando Entity Framework con el código primero. Tengo una tabla que no superará las 100 filas y me gustaría utilizar el tipo de datos byte (tinyint en SQL Server) como la clave principal.Uso de byte como el tipo de datos de la clave principal

Esto es lo que tengo hasta ahora:

[Key] 
public byte Id { get; set; } 

El problema es cuando Entity Framework crea la base de datos, no está estableciendo la propiedad de especificación de identidad que permite a las filas incremento automático en el inserto.

Si cambio el tipo de datos a Int16 (smallint en SQL Server) todo funciona perfectamente.

¿Hay alguna manera de decirle a Entity Framework que configure la propiedad de incremento automático o puede un byte no ser utilizado como la clave principal con Entity Framework primero?

+5

¿Por qué restringirías tu base de datos de esta manera? Si solo son pocas filas, el espacio adicional no duele. – delnan

+2

@delnan, sí, ¿por qué no hacerlo un varchar (100) ** ';-)' **. Siempre debe elegir el tipo de datos más restrictivo correcto disponible, especialmente para un PK. Si usa este PK como FK en una tabla con 50 millones de filas y agrega un índice, habrá una diferencia. El tamaño de la columna afecta más que el espacio en disco, solo piense en la memoria caché y cuánto desperdicia para un error de selección de tipo de datos trivial. Además, si su aplicación se asusta y trata de insertar un valor de salida o rango, fallará. –

Respuesta

13

El tipo byte es compatible como clave y como columna de identidad. No es el valor predeterminado marcar la clave primaria byte como identidad. Pero se puede sobrescribir este valor predeterminado:

[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public byte Id { get; set; } 

ajuste de la opción Identity no es explícitamente necesaria para una int, una long y una short (? Y tal vez más tipos), pero es un byte (= tinyint en SQL Servidor). Lo descubrí haciendo pruebas, pero no pude encontrarlo oficialmente documentado en ninguna parte.

+0

¡Perfecto! ¡Exactamente lo que estaba buscando! ¡Gracias! – user962926

+0

Para una propiedad 'short' que es una clave principal no identificada, tuve que usar este atributo con el valor' DatabaseGeneratedOption.None'. ¡Gracias! – STW

+0

Simplemente hacer tachuelas en un nuevo atributo con una Add-Migration adicional no funcionó para mí. La IDENTIDAD (1,1) no se agregó. Tuve que eliminar mis migraciones y la tabla antes de que finalmente se agregara. Estoy usando EF 6.1.3. –

Cuestiones relacionadas