2014-09-09 14 views
5

Sto cercando di ottenere le informazioni sulla chiave primaria per ogni voce che sto inserendo, aggiornando o eliminando in un'applicazione EF5. Io uso il codice simile a questo:Ottieni la chiave primaria di DBEntityEntry quando si aggiunge

//Get collection of each insert, update, or delete made on the entity. 
IEnumerable<DbEntityEntry> changedEntries = this.ChangeTracker.Entries() 
    .Where(e => e.State == EntityState.Added 
     || e.State == EntityState.Modified 
     || e.State == EntityState.Deleted); 

foreach (DbEntityEntry entry in changedEntries) 
{ 
    //Get primary key collection 
    EntityKey key = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager 
     .GetObjectStateEntry(entry.Entity).EntityKey; 

    string keyName; 
    //Get name of first key. Make sure a collection was returned. 
    if (key.EntityKeyValues != null) 
     keyName = key.EntityKeyValues[0].Key; 
    else 
     keyName = "(NotFound)"; 
} 

Il problema con questo codice, tuttavia, è che non funziona quando un nuovo record viene inserito nel database. Quando lo stato della voce è EntityState.Added, key.EntityKeyValues ​​ha un valore null (questo codice imposta il valore di keyName su "(NotFound)."

C'è un modo per ottenere il nome della colonna per la chiave primaria quando viene inserito un record

+0

Perché ottenere il nome della chiave da oggetti più e più volte? Dovresti scaricarlo dai metadati: http://stackoverflow.com/q/7253943/861716. –

risposta

9

ho trovato un modo per farlo, unendo il mio codice originale con il codice dal link Gert inviato:

//Get collection of each insert, update, or delete made on the entity. 
IEnumerable<DbEntityEntry> changedEntries = this.ChangeTracker.Entries() 
    .Where(e => e.State == EntityState.Added 
     || e.State == EntityState.Modified 
     || e.State == EntityState.Deleted); 

foreach (DbEntityEntry entry in changedEntries) 
{ 
    EntitySetBase setBase = ObjectContext.ObjectStateManager 
     .GetObjectStateEntry(entry.Entity).EntitySet; 

    string[] keyNames = setBase.ElementType.KeyMembers.Select(k => k.Name).ToArray(); 
    string keyName; 
    if (keyNames != null) 
     keyName = keyNames.FirstOrDefault(); 
    else 
     keyName = "(NotFound)"; 
} 

Finora, sembra funzionare, anche quando ho aggiungi un nuovo record

+3

Se è necessario il valore: int keyOrdinal = entry.CurrentValues.GetOrdinal (keyName); string keyVal = entry.CurrentValues.GetValue (keyOrdinal); – MJK

+1

Il valore può anche essere recuperato con 'var keyVal = entry.CurrentValues ​​[keyName];' – Tim