2013-06-06 11 views
18

Sto sviluppando un'applicazione ASP.net utilizzando Entity Framework. Sto usando DetailsView per inserire dati nel database. C'è un tavolo come Client e la sua chiave primaria è client_id. client_id viene generato automaticamente dal database. Devo generare automaticamente client_id dopo aver inserito un record nella tabella Client e assegnarlo a un campo nascosto per uso futuro.Ottieni ID record in Entity Framework dopo l'inserimento

Ho cercato su questo e ho trovato molte soluzioni. Ma non so come usarli da quando sono nuovo su asp.net. Ho scoperto che Entity Framework popola automaticamente gli oggetti di business con i valori generati da db dopo la chiamata SaveChanges(). La mia domanda è dove dovrei chiamare questo nella mia lezione parziale? Qual è l'evento?

Sto usando DetailsView con EntityDataSource e lego EntityDataSource direttamente con Entity Model, quindi non sto creando oggetti per inserire dati.

+0

Eventuali duplicati di [? Come posso ottenere l'identificazione del soggetto inserito nel quadro Entità] (http://stackoverflow.com/questions/5212751/how-can-i- get-id-of-inserted-entity-in-entity-framework) –

+1

@Michael Freidgeim non è un duplicato perché Bishan lo desidera con EntityDataSource e la domanda e le risposte non si riferiscono a EntityDataSource. –

risposta

3

Questo è quello che sto cercando.

in classe parziale

protected void clientDataSource_OnInserted(object sender, EntityDataSourceChangedEventArgs e) 
{ 

    int newPrimaryKey = ((Client)e.Entity).ClientId; 
    Debug.WriteLine(" Client ID is " + newPrimaryKey); 

} 

e aggiunto sotto la linea in EntityDataSource nella pagina aspx.

OnInserted="clientDataSource_OnInserted" 
+1

Grazie! Questo è esattamente quello che stavo cercando! –

5

Dopo aver inserito l'entità, è necessario aggiornarla in modo che la proprietà associata alla chiave primaria nel database abbia il nuovo valore PK.

Come MyObject.Id vi darà il nuovo ID

+0

Sto usando DetailsView con EntityDataSource e vincolo EntityDataSource direttamente con Entity Model. quindi non sto creando oggetti per inserire dati. – Bishan

37

Dopo la chiamata al _dbContext.SaveChanges(), l'entità verrà automaticamente aggiornato con il nuovo valore di campo di identità.

Il codice seguente presuppone che l'Entity Framework nome del contenitore entità è MyEntities, e la tabella Clienti del database ha almeno il due seguenti campi:

client_id int identity 
client_name varchar(25) 

Il codice potrebbe essere simile a questo:

// Establish DbContext 
private readonly MyEntities _dbContext = new MyEntities(); 

// Create new client table entity and initialize its properties 
var clientEntity = new Client { client_name="MyCo" }; 

// Add it to the ORM's collection of Client entities 
_dbContext.Clients.Add(clientEntity); 

// Save the new entity to the database 
_dbContext.SaveChanges(); 

// Return the identity field from the existing entity, 
// which was updated when the record was saved to the database 
return clientEntity.client_id; 
+0

Sto usando 'DetailsView' con' EntityDataSource' e lego 'EntityDataSource' direttamente con Entity Model. quindi non sto creando oggetti per inserire dati. – Bishan

0

Grazie, ho trascorso 3 giorni a cercare e cercare con risultati complicati ma questa soluzione è geniale! Qui è in vb.net:

Protected Sub dvArticulos_ItemInserted(sender As Object, e As EntityDataSourceChangedEventArgs) Handles EntityDataSource1.Inserted 
    Dim last_Serie As Long = DirectCast(e.Entity, articulos).Serie 
    Session("Articulo") = last_Serie 
End Sub