tutorial mvc framework first español code c# sql database entity-framework entity-framework-6

c# - first - entity framework mvc 5



Cómo utilizar la propiedad String como clave principal en Entity Framework (3)

Soy nuevo en EF y trato de dar mis primeros pasos mediante el primer acercamiento de código en ETF6.0 y ahora tengo un problema.

Tengo una propiedad

[Key] public string FooId { get; set; }

que es mi clave principal para el modelo.

Pero si ejecuto el

PM> Actualizar-Base de datos

comando en la consola del administrador de paquetes para actualizar las migraciones pendientes a la base de datos obtengo el siguiente error:

La columna de identidad ''FooId'' debe ser del tipo de datos int, bigint, smallint, tinyint o decimal o numérica con una escala de 0 y restringida para que no se pueda excluir.

Si cambio el PK en mi modelo a

[Key] public int FooId { get; set; }

todo funciona bien

Pero necesitaría PK para ser de tipo cadena porque tiene sentido en mi caso. Sé que hay desventajas, pero para mí es necesario.

Vi una publicación más antigua aquí Cómo hacer que la cadena sea la clave principal en el marco de la entidad. .

Pero parece que no resuelve mi problema o simplemente no lo entiendo.

¿Realmente es que no puedo usar una cadena como PK en una base de datos SQL?

¿O hay una manera de hacer eso?


¿Cuál es tu razón para tener una cadena como clave principal?

Simplemente establecería la clave primaria en un campo entero de incremento automático y pondría un índice en el campo de cadena.

De esta forma, si haces búsquedas en la mesa, deberían ser relativamente rápidas, y todas tus uniones y búsquedas normales no se verán afectadas en su velocidad.

También puede controlar la cantidad del campo de cadena que se indexa. En otras palabras, puede decir "solo indexe los primeros 5 caracteres" si cree que será suficiente. O si sus datos pueden ser relativamente similares, puede indexar todo el campo.


Esta es la forma correcta de crear un PK sin Identity Autoincrement habilitado:

[Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public string FooId { get; set; }


Si necesita que su clave principal sea una cadena, no la convierta en una columna de identidad. Las columnas de identidad generarán valores clave primarios para usted, que debe desactivar si tiene la intención de generar los valores usted mismo.