Direktes Ausführen von Speicherbefehlen

Mit Entity Framework können Sie direkt beliebige Datenquellenbefehle ausführen.

Der Speicherbefehl wird im Kontext der aktuellen Transaktion ausgeführt, wenn eine solche Transaktion vorhanden ist. Wenn die Verbindung durch den ObjectContext vor dem Aufruf einer der folgenden Methoden nicht hergestellt ist, stellt Entity Framework die Verbindung vor dem Ausführen der Abfrage her und beendet die Verbindung, nachdem die Ausführung der Abfrage abgeschlossen ist. Weitere Informationen zur Ausführung von Abfragen finden Sie unter Objektabfragen (Entity Framework). Die folgenden Methoden gehören zum ObjectContext-Typ. Beispiele zur Verwendung der Methoden finden Sie unter Vorgehensweise: Direktes Ausführen von Befehlen für die Datenquelle. Die:

Materialisieren des Ergebnistyps

Für die vorherigen Methoden, die einen generischen Ergebnistypparameter akzeptieren, kann TResult ein primitiver Typ, ein Entitätstyp oder irgendein benutzerdefinierter Typ sein. Der Typ muss nicht im konzeptionellen Modell von Entity Framework definiert werden. Wenn der angegebene Typ ein Typ ist, der nicht im konzeptionellen Modell definiert wird, oder kein primitiver Typ ist, gelten die folgenden Zuordnungskonventionen.

Der Typ:

  • Darf nicht abstrakt sein.

  • Muss über einen Standardkonstruktor verfügen.

Jede Eigenschaft des Typs:

  • Muss eine Set-Methode haben.

  • Muss einem primitiven Typ in CSDL entsprechen.

  • Muss einem Spaltennamen im resultierenden DbDataReader-Objekt entsprechen (die Anbieterimplementierung bestimmt, ob eine Spalte den gleichen Namen wie die Eigenschaft hat). Wenn der Name der Eigenschaft des Typs nicht mit einem Feld des DbDataReader-Objekts übereinstimmt, materialisiert Entity Framework den Standardwert der Eigenschaft, wenn diese im konzeptionellen Modell definiert ist.

Arbeiten mit parametrisierten Befehlen

Die Verwendung parametrisierter Befehle hilft beim Schutz vor SQL Injection-Angriffen, bei denen ein Angreifer einen Befehl in eine SQL-Anweisung einschleust, der die Sicherheit auf dem Server gefährdet. Parametrisierte Befehle schützen vor solchen Angriffen, indem sie garantieren, dass Werte aus einer externen Quelle lediglich als Werte und nicht als Bestandteil einer SQL-Anweisung weitergeleitet werden. In einen Wert eingefügte SQL-Befehlewerden daher nicht in der Datenquelle ausgeführt. Stattdessen werden sie nur als Parameterwert ausgewertet. Parametrisierte Befehle sind aber nicht nur aus Sicherheitsgründen vorteilhaft, sondern sie stellen auch eine bequeme Methode zum Organisieren von Werten dar, die mit einer SQL-Anweisung weitergeleitet bzw. an eine gespeicherte Prozedur übergeben werden.

Wenn Sie die ExecuteStoreCommand-Methode oder eine der ExecuteQuery-Überladungen (ExecuteStoreQuery oder ExecuteStoreQuery) aufrufen und das commandText-Argument und das parameters-Argument übergeben, generiert Entity Framework eine neue DbCommand-Instanz unter Verwendung der aktuellen Objektkontextverbindung und legt die CommandText ** -Eigenschaft auf commandText und die Parameters-Eigenschaft auf parameters fest. Der parameters-Wert kann ein Array von DbParameter-Objekten oder ein Array von Parameterwerten sein. Wenn aber Werte angegeben werden, wird ein Array von DbParameter-Objekten auf der Grundlage der Reihenfolge der Arraywerte erstellt. Der zugrunde liegende Anbieter bestimmt auf der Grundlage des Common Language Runtime (CLR)-Typs den entsprechenden DbType-Typ für das Parameterobjekt. Der ParameterName.Wert der einzelnen Parameterobjekte wird nach dem folgenden Muster erstellt: "pn", wobei n die nullbasierte Ordnungszahl des Parameterarguments ist.

Beispielsweise sind die beiden folgenden Methodenaufrufe gleichbedeutend:

context.ExecuteStoreQuery<Product>("select * from Products where pid = {0}", 1);

context.ExecuteStoreQuery<Product>("select * from Products where pid = @p0", new SqlParameter { ParameterName = "p0", Value = 1 });

Siehe auch

Aufgaben

Vorgehensweise: Direktes Ausführen von Befehlen für die Datenquelle