Wir verwenden Entity Framework 6.0.0 und verwenden zuerst die Datenbank (so) } _, um Code aus Tabellen und gespeicherten Prozeduren zu generieren. Dies scheint großartig zu funktionieren, mit der Ausnahme, dass Änderungen in gespeicherten Prozeduren beim Aktualisieren oder Aktualisieren des Modells nicht berücksichtigt werden. Das Hinzufügen einer Spalte zu einer Tabelle wird übernommen, jedoch kein Feld zu einer gespeicherten Prozedur.
Wenn ich zum Model Browser
gehe, mit der rechten Maustaste auf die gespeicherte Prozedur klicken, Add Function Import
auswählen und auf die Schaltfläche Get Column Information
klicken, werden die korrekten Spalten angezeigt. Dies bedeutet, dass das Modell die Spalten kennt, den generierten Code jedoch nicht aktualisieren kann.
Es gibt eine Problemumgehung, nämlich das Löschen der generierten gespeicherten Prozedur, bevor das Modell aktualisiert wird. Dies funktioniert, solange Sie keine Änderungen an der gespeicherten Prozedur vorgenommen haben. Kennt jemand eine Möglichkeit, diese Problemumgehung zu vermeiden?
Ich verwende Visual Studio 2013
mit den neuesten Updates ab Anfang Dezember 2013.
Danke im Voraus!
Update 1: Andersrs Antwort half in einem Fall, in dem die gespeicherte Prozedur eine temporäre Tabelle verwendete, also gab ich ihm +1, aber sie löst das Hauptproblem der Aktualisierung einfacher gespeicherter Prozeduren immer noch nicht.
Update 2: Shimrons Kommentar unten verlinkt auf eine Frage zu den gleichen Problemen in EF 3.5. Es scheint, dass das gleiche immer noch für EF 6.0 gilt. Lesen Sie es für eine alternative Vorgehensweise, aber meine Schlussfolgerung ist jetzt, dass die einfachste Möglichkeit darin besteht, die generierte gespeicherte Prozedur zu löschen, bevor Sie das Modell aktualisieren. Verwenden Sie Teilkurse, wenn Sie etwas Besonderes tun möchten.
Basierend auf dieser Antwort von DaveD beziehen sich diese Schritte auf das Problem:
.edmx
auf und wählen Sie Model Browser.Gibt Ihre gespeicherten Prozeduren zufällig Daten aus temporären Tabellen zurück? EF scheint dies nicht zu unterstützen, siehe EF4 - Die ausgewählte gespeicherte Prozedur gibt keine Spalten zurück Weitere Informationen.
Die gespeicherte Prozedur ist jedoch, wie Sie festgestellt haben, im Modellbrowser verfügbar. Ich habe einen schnellen Test mit dem oben beschriebenen Szenario durchgeführt. Die gespeicherte Prozedur wurde in meiner Kontextklasse generiert, der Rückgabetyp war jedoch eher ein Int als ein komplexer Typ. Siehe den Link oben für mögliche Problemumgehungen.
Ich bin gerade auf dieses Problem gestoßen, und meine Problemumgehung (es ist wirklich böse) bestand darin, eine if -Anweisung mit einer Bedingung zu erstellen, die an der Spitze der gespeicherten Prozedur niemals wahr sein wird. Dabei wird dieselbe Liste der Ausgaben wie die Abfrage mit expliziter Umwandlung in die Datentypen ausgewählt Ich möchte zurückkehren. Dies setzt voraus, dass Ihre Typen ungültig sind, sodass Sie die Besetzung in eine ISNULL
einschließen.
Wenn Ihre Ausgabe beispielsweise die Spalten enthält:
UserId (int, not null)
RoleId (int, nullable)
FirstName (varchar(255), nullable)
Created (datetime, not null)
Sie würden damit rechnen, ein POCO zu erstellen:
SomeClass {
public int UserId { get; set; }
public int? RoleId { get; set; }
public string FirstName { get; set; }
public DateTime Created { get; set; }
}
... aber es ist nicht so und deshalb sind wir heute hier. Damit dies nicht wie erwartet funktioniert, füge ich oben in SP (direkt nach dem 'AS') Folgendes ein:
if(1=0)
begin
select
UserId = isnull((cast(0 as int)),0),
RoleId = cast(0 as int),
FirstName = cast(0 as varchar),
DateTime = isnull((cast(0 as datetime)),'')
end
Es ist schrecklich und hässlich, aber es funktioniert jedes Mal für mich. Hoffentlich erhalten wir ein Tooling-Update, das dieses Problem bald löst. Das ist mir heute ohne temporäre Tabellen in SQL Server 2016 mit VS2015 passiert ...
Hoffe das hilft jemandem