2013-06-06 24 views
18

Zajmuję się tworzeniem aplikacji ASP.net za pomocą Entity Framework. Używam DetailsView do wstawiania danych do bazy danych. Istnieje tabela jako Client, a jej klucz podstawowy to client_id. client_id jest generowany automatycznie przez bazę danych. Po wstawieniu rekordu do tabeli Client muszę wygenerować automatycznie wygenerowany numer i przypisać go do ukrytego pola do wykorzystania w przyszłości.Uzyskaj identyfikator rekordu w Entity Framework po wstawieniu

Szukałem o tym i znalazłem wiele rozwiązań. Ale nie wiem jak z nich korzystać, ponieważ jestem nowy w asp.net. Zauważyłem, że Entity Framework automatycznie zapełnia obiekty biznesowe wartościami wygenerowanymi przez bazę danych po wywołaniu SaveChanges(). Moje pytanie brzmi: gdzie powinienem to nazwać w mojej częściowej klasie? Jakie jest wydarzenie?

Używam DetailsView z EntityDataSource i wiążę EntityDataSource bezpośrednio z Entity Model, więc nie będę tworzyć obiektów do wstawiania danych.

+0

Możliwy duplikat [? Jak mogę uzyskać identyfikator wstawionego podmiot w Entity Framework] (http://stackoverflow.com/questions/5212751/how-can-i- get-id-of-insert-entity-in-entity-framework) –

+1

@ Michael Freidgeim nie jest duplikatem, ponieważ Bishan chce go z EntityDataSource, a pytania i odpowiedzi nie odnoszą się do EntityDataSource. –

Odpowiedz

3

Tego właśnie szukam.

w częściowy klasy

protected void clientDataSource_OnInserted(object sender, EntityDataSourceChangedEventArgs e) 
{ 

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

} 

i dodano w temperaturze poniżej linii w EntityDataSource na stronie aspx.

OnInserted="clientDataSource_OnInserted" 
+1

Dziękujemy! Właśnie tego szukałem! –

5

Po wstawieniu obiektu należy go zaktualizować, tak aby właściwość odwzorowująca klucz podstawowy w bazie danych miała nową wartość PK.

Jak MyObject.Id daje nowy identyfikator

+0

Używam DetailView z EntityDataSource i wiążące EntityDataSource bezpośrednio z Entity Model. więc nie tworzę obiektów do wstawiania danych. – Bishan

37

Po wywołaniu _dbContext.SaveChanges(), jednostka zostanie automatycznie zaktualizowana z nową wartość pola tożsamości.

Poniższy kod zakłada swoje imię pojemnik jednostka Entity Framework jest MyEntities i tabela Klient bazy danych zawiera co najmniej dwa następujące pola:

client_id int identity 
client_name varchar(25) 

Twój kod może wyglądać mniej więcej tak:

// 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

Używam 'DetailsView' z' EntityDataSource' i powiązanie 'EntityDataSource' bezpośrednio z Entity Model. więc nie tworzę obiektów do wstawiania danych. – Bishan

0

Dzięki temu spędziłem 3 dni na wyszukiwaniu i wyszukiwaniu z zawiłymi wynikami, ale to rozwiązanie jest genialne! Oto ona w 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