2015-01-09 19 views
6

È possibile incrementare automaticamente una proprietà che non è la chiave primaria in Entity Framework? Quello che ho è una classe che ha un ID, ma anche un numero di serie:Proprietà incremento automatico non chiave

public class Maintenance 
{ 
    [Key] 
    public int ID { get; set; } 
    public int GroupID { get; set; } 
    public int SerialNo { get; set; } 
} 

Ho un indice su GroupID e SerialNo con un rapporto unico, rendendo impossibile per un gruppo per avere lo stesso numero di serie due volte .

Quello che sto facendo attualmente è controllare .Max() per SerialNo all'interno di quel gruppo. Mi piacerebbe comunque se il numero di serie fosse auto incrementato. È possibile?

Sono stato alla ricerca di una soluzione, ma per quanto ho capito, non è possibile avere 2 colonne autoincrementanti con quadro entità e che la colonna autoincremento sarà sempre la colonna PK.

C'è un modo per impostare l'incremento automatico oppure esiste una soluzione migliore del problema rispetto all'utilizzo di Max()? L'utilizzo di Max() potrebbe teoricamente produrre 2 valori identici e provocherà l'arresto anomalo del programma durante il tentativo di inserimento (a causa dell'indice univoco).

Sto usando il codice prima.

Per chiarire: Voglio mantenere l'ID come chiave primaria e calcolare il numero di serie durante l'inserimento.

UPDATE:

Ho provato con [DatabaseGenerated(DatabaseGeneratedOption.Identity)] su SerialNo che si traduce in Entity Framework voler cambiare la chiave primaria a questa proprietà. Ho anche provato [DatabaseGenerated(DatabaseGeneratedOption.Computed)], che tenta di inserire NULL nella colonna SerialNo e [DatabaseGenerated(DatabaseGeneratedOption.None)] che tenta di inserire 0, in pratica facendo 'nulla'.

informazioni richieste:

Questo è un esempio di come la tabella potrebbe apparire:

|_ID_|_GroupID_|_SerialNo_| 
| 1 | 1 | 1  | 
| 2 | 1 | 2  | 
| 3 | 2 | 1  | 
| 4 | 1 | 3  | 
| 5 | 2 | 2  | 
+2

Hai trovato una soluzione a questo? Ho la stessa domanda/problema ... – Mike

+0

No, scusami @Mike non l'ho fatto. Sto ancora usando '.Max()' –

risposta

6

Sì, è possibile utilizzare il following attribute:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int SerialNo { get; set; } 

Vedi HERE per un elenco di possibili annotazioni di dati.

+2

Ciao, grazie per il link. Sarebbe di grande aiuto. Usando 'DatabaseGenerationOption.Identity' costringerà' SerialNo' a diventare la chiave primaria per l'oggetto, che non è quello che voglio.Voglio mantenere l'ID come chiave primaria e calcolare il numero di serie durante l'inserimento. –

+0

@RobinDorbell: 'Voglio mantenere l'ID come chiave primaria e calcolare il numero di serie durante l'inserimento. - Questo ha assolutamente senso, ma non è quello che hai chiesto ;-). Forse puoi darci qualche esempio di come dovrebbero essere/possono essere le tue file? – ChrFin

+1

È 'DatabaseGeneratedOption' e non' DatabaseGenerationOption'. –

1

Se si utilizza il server SQL di leggere anche questo attentamente

Can we have more than one identity columns in a table.


Quindi penso che sotto il codice di compilazione, ma vi darà un errore quando si cerca di migrare/creare database.

è anche possibile utilizzare correntemente approch api come questo

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Maintenance>().Property(a => a.GroupID 
         ).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    modelBuilder.Entity<Maintenance>().Property(a => a.SerialNo 
         ).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
} 
Problemi correlati