1

Umwelt:Entity Framework (Datenbank zuerst) hat falsches Rückergebnis von Stored Procedure

  • Visual Studio 2017
  • SQL Server 2016
  • EF v6 mit einem Datenbank-First-Ansatz

Hintergrund: Die gespeicherte Prozedur befindet sich im EDMX. Meine gespeicherte Prozedur setzt den Rückgabewert auf 0, wenn nichts passiert ist, 1 wenn etwas betroffen ist und Wert von @@ ERROR wenn Fehler.

HINTERGRUND 1: meine gespeicherte Prozedur, LTM_Lease_DeleteSubFiles, tut SET NOCOUNT ON am oberen und Sätzen Rückgabewert mit RETURN Befehl am Ende der gespeicherten Prozedur.

PROBLEM 1: mein Ruf -1 zurück, die nicht einmal in der gespeicherten Prozedur ist:

var spResults = context.LTM_Lease_DeleteSubFiles(...) 

HINTERGRUND 2: meine gespeicherten Prozedur DOIOwnerChanges_Apply Sätze Rückgabewert mit RETURN Befehl am Ende der gespeicherte Prozedur.

PROBLEM 2: mein Aufruf gibt den Wert von 8, die nicht einmal in der gespeicherten Prozedur gefunden wird:

var spResults = context.DOIOwnerChanges_Apply(...) 

Antwort

0

GRUND - Das Template Builder für EF (einschließlich v6) falsch setzt der SP up als Rückgabe eines INT, der die Zeilenanzahl und nicht den Rückgabewert enthält, weil er fälschlicherweise die falsche ObjectContext.ExecuteFunction (in der von der Vorlage generierten Klasse YourDatabaseEntities, die das Kind des DBContext ist) gefunden hat.

Warum falsche ExecuteFunction? - Das Ergebnisset sagt falsch die Zeilenanzahl der geänderten Zeilen und nicht den Rückgabewert oder die Ausgabeparameter, da es eine andere ExecuteFunction aufruft, die die Ergebnisse verwirft. Der Überflug-Intellisense-Hinweis der ObjectContext.ExecuteFunction sagt "Führt eine gespeicherte Prozedur aus .... verwirft alle von der Funktion zurückgegebenen Ergebnisse und gibt die Anzahl der von der Ausführung betroffenen Zeilen zurück" anstelle des üblichen "Führt eine gespeicherte Prozedur aus ... mit den angegebenen Parametern ".

WARUM PROBLEM 1 IS -1: Ich glaube, die SET NOCOUNT ON bewirkt, dass der SP kein Zählergebnis zurückgibt und dass Microsoft ExecuteFunction das als Fehlercode zurückgibt.

WARUM PROBLEM 2 IST 8: Der SP zurückgegeben 8 Zeilen mit Daten anstelle des Rückgabewerts, da Microsoft die falsche ExecuteFunction verwendet.

SP FIX ZUM PROBLEM 1 - Sie müssen SET NOCOUNT ON auskommentieren.

SP FIX ZUM PROBLEM 1 und 2 - Sie müssen die gespeicherte Prozedur ändern, um den Befehl SELECT als letzte Anweisung anstelle des Befehls RETURN auszuführen.

LÖSUNG FIX - 1) Löschen Sie SP nach dem Reparieren von SP aus dem Ordner Funktionsimporte und dem SP-Ordner des Datenspeichers. [Durch diese Änderung wird der EF-Vorlagengenerator veranlasst, dass der SP-Aufruf zu einem ObjectResult von Nullable-INT anstelle eines einzelnen INT-Ergebnisses wird.] 2) Laden Sie den SP mit dem "Update Model from Database" erneut in das EDMX. 3) Erstellen Sie alle Ihre Daten neu Projekt, in dem sich der EDMX befindet. 4) Beenden Sie Visual Studio und kehren Sie zurück. 5) Erstellen Sie die Gesamtlösung neu.

ANDERE LÖSUNGEN-Quelle: David Browne von Microsoft-1) Schreiben Sie die SP einen Ausgabeparameter erstellen und das Ergebnis dort zurück. 2) Führen Sie einen THROW oder RAISERROR aus, wenn ein Fehler auftritt.

Verwandte Themen