2014-09-09 33 views
5

Próbuję uzyskać podstawowe informacje o kluczach dla każdego wpisu, który wstawiam, aktualizuję lub usuwam w aplikacji EF5. I użyć kodu podobnego do tego:Uzyskaj klucz podstawowy DBEntityEntry podczas dodawania

//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)"; 
} 

problem z tym kodem jest jednak to, że to nie działa, gdy nowy rekord jest włożona do bazy danych. Gdy stan wpisu to EntityState.Added, klucz.EntityKeyValues ​​ma wartość pustą (ten kod ustawia wartość keyName na "(NotFound)".

Czy istnieje sposób uzyskania nazwy kolumny dla klucza podstawowego, gdy płyta jest włożona

+0

Po co wielokrotnie otrzymywać nazwę klucza z obiektów? Powinieneś go pobrać z metadanych: http://stackoverflow.com/q/7253943/861716. –

Odpowiedz

9

ja wymyśliliśmy sposób, aby to zrobić, łącząc mój oryginalny kod z kodem z linku Gert Wysłany:

//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)"; 
} 

jak dotąd wydaje się działać, nawet gdy dodać nowy rekord

+3

Jeśli potrzebujesz wartości: int keyOrdinal = entry.CurrentValues.GetOrdinal (keyName); string keyVal = entry.CurrentValues.GetValue (keyOrdinal); – MJK

+1

Wartość można również pobrać za pomocą 'var keyVal = entry.CurrentValues ​​[keyName];' – Tim