Gespeicherte Prozeduren für CUD-Vorgänge im Designer

In dieser exemplarischen Vorgehensweise wird Schritt für Schritt gezeigt, wie Sie die CUD-Vorgänge (Create, Insert, Delete = Erstellen, Einfügen, Löschen) eines Entitätstyps gespeicherten Prozeduren mithilfe des Entity Framework-Designers (EF Designer) zuordnen.  Standardmäßig generiert Entity Framework die SQL-Anweisungen für die CUD-Vorgänge automatisch. Sie können gespeicherte Prozeduren diesen Vorgängen jedoch auch zuordnen.  

Beachten Sie, dass Code First die Zuordnung zu gespeicherten Prozeduren oder Funktionen nicht unterstützt. Sie können gespeicherte Prozeduren oder Funktionen jedoch mithilfe der Methode „System.Data.Entity.DbSet.SqlQuery“ aufrufen. Beispiel:

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]");

Zu Beachtendes beim Zuordnen der CUD-Vorgänge zu gespeicherten Prozeduren

Beim Zuordnen der CUD-Vorgänge zu gespeicherten Prozeduren gelten die folgenden Grundsätze:

  • Wenn Sie einen der CUD-Vorgänge einer gespeicherten Prozedur zuordnen, ordnen Sie alle Vorgänge zu. Wenn Sie nicht alle drei Vorgänge zuordnen, schlagen die nicht zugeordneten Vorgänge bei der Ausführung fehl, und UpdateException wird ausgelöst.
  • Sie müssen jeden Parameter der gespeicherten Prozedur Entitätseigenschaften zuordnen.
  • Wenn der Server den Primärschlüsselwert für die eingefügte Zeile generiert, müssen Sie diesen Wert wieder der Schlüsseleigenschaft der Entität zuordnen. Im nachfolgenden Beispiel gibt die gespeicherte Prozedur InsertPerson den neu erstellten Primärschlüssel als Teil ihres Resultsets zurück. Der Primärschlüssel wird dem Entitätsschlüssel (PersonID) mithilfe des Features <Ergebnisbindungen hinzufügen> von EF Designer zugeordnet.
  • Die Aufrufe gespeicherter Prozeduren werden 1:1 den Entitäten im konzeptionellen Modell zugeordnet. Wenn Sie beispielsweise eine Vererbungshierarchie in Ihrem konzeptionellen Modell implementieren und dann die gespeicherten CUD-Prozeduren für die übergeordneten (Basis-) und die untergeordneten (abgeleiteten) Entitäten zuordnen, ruft das Speichern der Änderungen an untergeordneten Entitäten nur die gespeicherten Prozeduren der untergeordneten Entitäten auf. Die gespeicherten Prozeduren der übergeordneten Entitäten werden nicht aufgerufen.

Voraussetzungen

Für diese exemplarische Vorgehensweise gelten folgende Voraussetzungen:

  • Eine aktuelle Version von Visual Studio
  • Die Beispieldatenbank School

Einrichten des Projekts

  • Öffnen Sie Visual Studio 2012.
  • Wählen Sie Datei > Neu > Projekt aus.
  • Klicken Sie im linken Bereich auf Visual C#, und wählen Sie dann die Konsolenvorlage aus.
  • Geben Sie CUDSProcsSample als Namen ein.
  • Klicken Sie auf OK.

Modellerstellung

  • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie Hinzufügen > Neues Element aus.

  • Wählen Sie Daten im linken Menü aus, und wählen Sie dann im Bereich „Vorlagen“ ADO.NET Entity Data Model aus.

  • Geben Sie CUDSProcs.edmx als Dateinamen ein, und klicken Sie dann auf Hinzufügen.

  • Wählen Sie im Dialogfeld „Modellinhalt auswählen“ Aus Datenbank generieren aus, und klicken Sie dann auf Weiter.

  • Klicken Sie auf Neue Verbindung. Geben Sie im Dialogfeld „Verbindungseigenschaften“ den Servernamen ein (z. B. (localdb)\mssqllocaldb), wählen Sie die Authentifizierungsmethode aus, geben Sie School als Datenbanknamen ein, und klicken Sie dann auf OK. Das Dialogfeld „Datenverbindung auswählen“ wird mit Ihrer Datenbankverbindungseinstellung aktualisiert.

  • Wählen Sie im Dialogfeld „Datenbankobjekte auswählen“ unter dem Knoten Tabellen die Tabelle Person aus.

  • Wählen Sie außerdem die folgenden gespeicherten Prozeduren unter dem Knoten Gespeicherte Prozeduren und Funktionen aus: DeletePerson, InsertPerson und UpdatePerson.

  • Ab Visual Studio 2012 unterstützt der EF Designer den Massenimport gespeicherter Prozeduren. Ausgewählte gespeicherte Prozeduren und Funktionen in das Entitätsmodell importieren ist standardmäßig aktiviert. Da in diesem Beispiel gespeicherte Prozeduren vorhanden sind, die Entitätstypen einfügen, aktualisieren und löschen, sollen diese nicht importieren werden. Deaktivieren Sie dieses Kontrollkästchen daher.

    Import S Procs

  • Klicken Sie auf Fertig stellen. Der EF Designer, der eine Entwurfsoberfläche zum Bearbeiten des Modells bereitstellt, wird angezeigt.

Zuordnen der Person-Entität zu gespeicherten Prozeduren

  • Klicken Sie mit der rechten Maustaste auf den Person-Entitätstyp, und wählen Sie Zuordnung der gespeicherten Prozedur aus.

  • Die Zuordnungen der gespeicherten Prozedur werden im Fenster Zuordnungsdetails angezeigt.

  • Klicken Sie auf <Insert-Funktion auswählen>. Das Feld wird zu einer Dropdownliste mit den gespeicherten Prozeduren im Speichermodell, die Entitätstypen im konzeptionellen Modell zugeordnet werden können. Wählen Sie in der Dropdownliste InsertPerson aus.

  • Es werden Standardmappings zwischen Parametern gespeicherter Prozeduren und Entitätseigenschaften angezeigt. Pfeile geben die Mappingrichtung an: Eigenschaftswerte sind Parametern gespeicherter Prozeduren zugeordnet.

  • Klicken Sie auf <Ergebnisbindung hinzufügen>.

  • Geben Sie NewPersonID ein, den Namen des Parameters, der von der gespeicherten Prozedur InsertPerson zurückgegeben wird. Achten Sie darauf, keine führenden oder nachstehenden Leerzeichen einzugeben.

  • Drücken Sie die EINGABETASTE.

  • Standardmäßig wird NewPersonID dem Entitätsschlüssel PersonID zugeordnet. Ein Pfeil gibt die Mappingrichtung an: Der Wert der Ergebnisspalte ist der Eigenschaft zugeordnet.

    Mapping Details

  • Klicken Sie auf <Update-Funktion auswählen>, und wählen Sie UpdatePerson aus der resultierenden Dropdownliste aus.

  • Es werden Standardmappings zwischen Parametern gespeicherter Prozeduren und Entitätseigenschaften angezeigt.

  • Klicken Sie auf <Delete-Funktion auswählen>, und wählen Sie DeletePerson aus der resultierenden Dropdownliste aus.

  • Es werden Standardmappings zwischen Parametern gespeicherter Prozeduren und Entitätseigenschaften angezeigt.

Die Einfüge-, Aktualisierungs- und Löschvorgänge des Entitätstyps Person werden nun gespeicherten Prozeduren zugeordnet.

Wenn Sie die Parallelitätsüberprüfung beim Aktualisieren oder Löschen einer Entität mit gespeicherten Prozeduren aktivieren möchten, verwenden Sie eine der folgenden Optionen:

  • Verwenden Sie einen OUTPUT--Parameter, um die Anzahl der betroffenen Zeilen aus der gespeicherten Prozedur zurückzugeben, und aktivieren Sie das Kontrollkästchen Parameter für betroffene Zeilen neben dem Parameternamen. Wenn der Vorgang aufgerufen wird und der zurückgegebene Wert null ist, wird OptimisticConcurrencyException ausgelöst.
  • Aktivieren Sie das Kontrollkästchen Ursprünglichen Wert verwenden neben einer Eigenschaft, die Sie für die Parallelitätsprüfung verwenden möchten. Wenn versucht wird, eine Aktualisierung durchzuführen, wird der ursprünglich aus der Datenbank ausgelesene Wert der Eigenschaft beim Rückschreiben der Daten in die Datenbank verwendet. Wenn der Wert nicht mit dem Wert in der Datenbank übereinstimmt, wird OptimisticConcurrencyException ausgelöst.

Verwenden des Modells

Öffnen Sie die Datei Program.cs, in der die Methode Main definiert ist. Fügen Sie der Funktion „Main“ den folgenden Code hinzu.

Der Code erstellt ein neues Person-Objekt, aktualisiert das Objekt und löscht das Objekt schließlich.

    using (var context = new SchoolEntities())
    {
        var newInstructor = new Person
        {
            FirstName = "Robyn",
            LastName = "Martin",
            HireDate = DateTime.Now,
            Discriminator = "Instructor"
        }

        // Add the new object to the context.
        context.People.Add(newInstructor);

        Console.WriteLine("Added {0} {1} to the context.",
            newInstructor.FirstName, newInstructor.LastName);

        Console.WriteLine("Before SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // SaveChanges will call the InsertPerson sproc.  
        // The PersonID property will be assigned the value
        // returned by the sproc.
        context.SaveChanges();

        Console.WriteLine("After SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // Modify the object and call SaveChanges.
        // This time, the UpdatePerson will be called.
        newInstructor.FirstName = "Rachel";
        context.SaveChanges();

        // Remove the object from the context and call SaveChanges.
        // The DeletePerson sproc will be called.
        context.People.Remove(newInstructor);
        context.SaveChanges();

        Person deletedInstructor = context.People.
            Where(p => p.PersonID == newInstructor.PersonID).
            FirstOrDefault();

        if (deletedInstructor == null)
            Console.WriteLine("A person with PersonID {0} was deleted.",
                newInstructor.PersonID);
    }
  • Kompilieren Sie die Anwendung, und führen Sie sie aus. Das Programm erzeugt die folgende Ausgabe.*

Hinweis

* PersonID wird automatisch vom Server generiert, sodass wahrscheinlich eine andere Zahl angezeigt wird.

Added Robyn Martin to the context.
Before SaveChanges, the PersonID is: 0
After SaveChanges, the PersonID is: 51
A person with PersonID 51 was deleted.

Wenn Sie mit der Ultimate-Version von Visual Studio arbeiten, können Sie IntelliTrace mit dem Debugger verwenden, um die SQL-Anweisungen anzuzeigen, die ausgeführt werden.

Debug With Intellitrace