2016-06-06 8 views
0

Hintergrund: Meine Datenbank macht alle CRUD-Operationen als gespeicherte Prozeduren verfügbar. Ich möchte die Vorteile von DbContext einschließlich Change Tracking nutzen. Eine Out-of-Box-Lösung besteht für Einfügen, Aktualisieren und Löschen von Operationen:Entity Framework Code - zuerst - Auswahl von Daten aus der gespeicherten Prozedur mit Änderungsverfolgung

protected override void OnModelCreating (DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Person>() 
.MapToStoredProcedures(c => 
c.Update(u => u.HasName("update_person") 
       .Parameter(p => p.Id, "person_id") 
       .Parameter(p => p.Name, "name")) 
.Delete(d => d.HasName("delete_person") 
       .Parameter(p => p.Id, "person_id")) 
.Insert(i => i.HasName("insert_person") 
       .Parameter(p => p.Name, "department_name"))); 
} 

Ich fand auch, wie die Daten aus einer gespeicherten Prozedur wählen:

Database.SqlQuery<Person>("select_persons", parameters); 

Hier ist die Frage: Wie kann ich meine DbContext Änderungsverfolgung der abgerufenen Datensätze durchführen? Also könnte ich einfach SaveChanges() anrufen?

Antwort

0

Für eine gespeicherte Prozedur select_persons, sollten Sie in der Lage zu tun:

List<select_persons_Result> myPeople = dbContext.select_persons().ToList(); 

Die select_persons_Result Klasse wird automatisch erstellt, wenn Sie die gespeicherten Prozeduren zum Modell hinzuzufügen.

Ich verstehe nicht, was Sie mit dem Aufruf SaveChanges() zu tun, wenn Sie gerade eine select tun.

+0

'select_persons' ist eine gespeicherte Prozedur in einer Datenbank. Wie sollte ich es auf "DbContext" mit Code-First-Ansatz abbilden? Ich habe einen Weg gefunden, die Prozedur mit 'DbContext.Database.SqlQuery ' aufzurufen, aber danach möchte ich einige Änderungen in der resultierenden Menge aus dem Code vornehmen und 'DbContext.SaveChanges()' aufrufen, um alle Änderungen zu speichern zurück zu DB. Ich möchte die entsprechende Prozedur nicht manuell für jeden hinzugefügten/geänderten/entfernten Datensatz aufrufen. –

+0

Ich war verwirrt. Ihr ** Hintergrund ** impliziert Database First, und ich sah das Code First-Tag nicht. Wenn Sie bereits über die Datenbank verfügen, sollten Sie ein Modell (EDMX-Datei) in Ihrer Lösung haben. Aktualisieren Sie das Modell aus der Datenbank, und die Klassen werden erstellt. Sie können die Logik des Sprocs ändern, ohne das Modell zu beeinflussen. Wenn Sie jedoch die Signatur ändern (z. B. eine Spalte zu den Rückgabedaten hinzufügen), aktualisieren Sie das Modell einfach erneut. –