webentwicklung-frage-antwort-db.com.de

EF 6-Datenbank zuerst: Wie aktualisiert man gespeicherte Prozeduren?

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.

43
Halvard

Basierend auf dieser Antwort von DaveD beziehen sich diese Schritte auf das Problem:

  1. Klicken Sie mit der rechten Maustaste in Ihrem .edmx auf und wählen Sie Model Browser.
  2. Erweitern Sie im Modellbrowser (in der Standardkonfiguration von VS 2015 ist eine Registerkarte im Projektmappen-Explorer) unter dem Modell die Option Function Imports.
  3. Doppelklicken Sie auf Ihre gespeicherte Prozedur.
  4. Klicken Sie auf die Schaltfläche Update neben gibt eine Collection Of - Complex zurück (wenn Sie keinen Skalar oder eine Entität zurückgeben).
  5. Klicken Sie auf okay und anschließend auf save Ihre .edmx, um die Feldänderungen Ihrer gespeicherten Prozedur im gesamten Projekt anzuzeigen.
94
Rick V

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.

2
andersr

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

0