2015-10-07 13 views
17

Sono nuovo in EF e provo a fare i primi passi con il primo approccio al codice in ETF6.0 e ora ho un problema.Come utilizzare la proprietà String come chiave primaria in Entity Framework

Ho un immobile

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

che è la mia chiave primaria per il modello.

Ma se faccio funzionare l'ordine

PM> Update-Database

in consolle gestore di pacchetti per aggiornare in attesa migrazioni al database ottengo il seguente errore:

Identity column 'FooId' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with a scale of 0, and constrained to be nonnullable.

Se cambio la PK nel mio modello di

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

tutto funziona correttamente.

Ma avrei bisogno che il PK fosse di tipo stringa perché è assolutamente sensato nel mio caso. So che ci sono degli svantaggi ma per me è necessario.

Ho visto un post più vecchio qui How to make string as primary key in entity framework!.

Ma sembra che non risolva il mio problema o semplicemente non lo capisco.

È davvero che non è possibile utilizzare una stringa come PK su un database SQL?

O c'è un modo per farlo?

+0

La chiave è in default per l'identità, quindi è necessario disattivare lo dall'attributo '[DatabaseGenerated (DatabaseGeneratedOption.None)] 'Ciò significa che è necessario specificare la chiave manualmente durante l'aggiunta (non viene generata). – Hopeless

risposta

29

Questo è il modo corretto di creare un PK senza identità autoincremento abilitato:

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

Se è necessario che la chiave primaria sia una stringa, non trasformarla in una colonna di identità. Le colonne di identità generano per te valori di chiave primaria, che dovresti disattivare se intendi generare autonomamente i valori.

1

Qual è la tua ragione per avere una stringa come chiave primaria?

Vorrei semplicemente impostare la chiave primaria su un campo intero incrementale automatico e inserire un indice nel campo stringa.

In questo modo, se esegui ricerche sul tavolo, dovrebbero essere relativamente veloci e tutti i tuoi join e le normali ricerche non saranno influenzati dalla loro velocità.

È anche possibile controllare la quantità del campo stringa che viene indicizzato. In altre parole, puoi dire "indicizza solo i primi 5 caratteri" se pensi che sarà sufficiente. O se i tuoi dati possono essere relativamente simili, puoi indicizzare l'intero campo.

+0

Suppongo che il suo ragionamento sia lo stesso del mio: puoi usare .Find (fooId) od oggetto contesto e applicare il caching di primo livello del framework di entità Io lo uso per username –

Problemi correlati