Entity Framework und SCOPE_IDENTITY
Ich habe eine gespeicherte Prozedur, die das einfügen in eine Tabelle, dann führt diese Linie
SET @returnVal = SCOPE_IDENTITY();
und danach habe ich beide ausprobiert:
SELECT @returnVal
und
return @returnVal
Wenn ich führen Sie die gespeicherte Prozedur in Microsoft SQL Server Management Studio, bekomme ich das erwartete Ergebnis mit SELECT @returnVal
- die identity-Spalte für die Eingabe ausgewählt ist.
Aber wenn ich die gespeicherte Prozedur, um meine ADO.Net Entity Data Modell /EntityFramework Klasse /.edmx-Klasse, und führen Sie die gespeicherte Prozedur in meinem C# - code, bekomme ich den Wert -1 zurück, ohne scheitern.
Ist es möglich, den Wert, den ich haben möchte, die neuen Identitätswert zurückgegeben?
Merke ich, dass ich könnte manuell binden Sie die gespeicherte Prozedur, die Sie auf Aktion einfügen der Tabelle in mein Modell - aber dies ist nicht eine option. Es gibt viel zu viele insert-Verfahren, dies zu tun die manuelle Arbeit jedes mal, wenn ich regeneriere meine model-Klasse(N).
- mögliche Duplikate von Erste SCOPE_IDENTITY von SQL Server auf Einfügen
- Sind Sie mit ExecuteNonQuery, wenn Sie sollten mit ExecuteScalar?
- und der code ausgeführt wird ? NonQuery durch Zufall
- Müssen Sie rufen Sie die sp mit executescalar
- Ich habe deine Antwort aus die Frage und fügte hinzu, als eine wiki-Antwort unten. Wenn Sie wollen, dies selbst zu tun lassen Sie mich wissen, und ich werde löschen der wiki-Antwort
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deklarieren Sie eine Ausgabe-Typ des Parameters in der Prozedur-definition:
und beim aufrufen der gespeicherten Prozedur nennen, wie:
entnommen aus der OPs-Frage
Hinzufügen eines Ausgabe-parameter gearbeitet (Antwort markiert unten).
Die gespeicherte Prozedur, die Signatur sieht jetzt wie folgt aus:
Meine gespeicherten Prozedur Signatur sieht jetzt wie folgt aus:
Die Letzte Zeile der gespeicherten Prozedur ist:
Mein C# - code sieht jetzt wie folgt aus: (db ist eine Instanz von meinem dbContext-Klasse)
context.Database.ExecuteSqlCommand
return den Befehl ausführen Ergebnis und nicht das Ergebnis der Abfrage.Wenn Sie brauchen, um Daten über die Nutzung
context.Database.SqlQuery
.SET @ReturnVal=SCOPE_IDENTITY()
und verwenden Sie dann die wählen Sie.Beispiel:
Wie zu verwenden DbContext.Datenbank.SqlQuery<TElement>(sql, params) mit der gespeicherten Prozedur? EF Code First CTP5