Unformatierte SQL-Abfragen (EF6)Raw SQL Queries (EF6)

Entity Framework ermöglicht es Ihnen, mithilfe von LINQ mit ihren Entitäts Klassen abzufragen.Entity Framework allows you to query using LINQ with your entity classes. Es kann jedoch vorkommen, dass Sie Abfragen mit unformatierten SQL-Daten direkt für die Datenbank ausführen möchten.However, there may be times that you want to run queries using raw SQL directly against the database. Dies schließt das Aufrufen von gespeicherten Prozeduren ein, was für Code First Modelle hilfreich sein kann, die derzeit keine Zuordnung zu gespeicherten Prozeduren unterstützen.This includes calling stored procedures, which can be helpful for Code First models that currently do not support mapping to stored procedures. Die in diesem Thema dargestellten Techniken gelten jeweils für Modelle, die mit Code First und dem EF-Designer erstellt wurden.The techniques shown in this topic apply equally to models created with Code First and the EF Designer.

Schreiben von SQL-Abfragen für EntitätenWriting SQL queries for entities

Die sqlQuery-Methode in dbset ermöglicht das Schreiben einer unformatierten SQL-Abfrage, die Entitäts Instanzen zurückgibt.The SqlQuery method on DbSet allows a raw SQL query to be written that will return entity instances. Die zurückgegebenen Objekte werden vom Kontext genau so nachverfolgt, als wären Sie durch eine LINQ-Abfrage zurückgegeben worden.The returned objects will be tracked by the context just as they would be if they were returned by a LINQ query. Beispiel:For example:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}

Beachten Sie, dass die Abfrage wie bei LINQ-Abfragen erst ausgeführt wird, wenn die Ergebnisse aufgezählt werden – im obigen Beispiel wird dies mit dem Auflistungs Auflistungs Vorgang durchgeführt.Note that, just as for LINQ queries, the query is not executed until the results are enumerated—in the example above this is done with the call to ToList.

Es muss sorgfältig vorgegangen werden, wenn unformatierte SQL-Abfragen aus zwei Gründen geschrieben werden.Care should be taken whenever raw SQL queries are written for two reasons. Zuerst muss die Abfrage geschrieben werden, um sicherzustellen, dass nur Entitäten zurückgegeben werden, die tatsächlich den angeforderten Typ aufweisen.First, the query should be written to ensure that it only returns entities that are really of the requested type. Wenn z. b. Funktionen wie die Vererbung verwendet werden, ist es einfach, eine Abfrage zu schreiben, mit der Entitäten des falschen CLR-Typs erstellt werden.For example, when using features such as inheritance it is easy to write a query that will create entities that are of the wrong CLR type.

Zweitens machen einige Typen von unformatierten SQL-Abfragen potenzielle Sicherheitsrisiken offen, insbesondere bei SQL Injection-Angriffen.Second, some types of raw SQL query expose potential security risks, especially around SQL injection attacks. Stellen Sie sicher, dass Sie die Parameter in der Abfrage auf die richtige Weise verwenden, um solche Angriffe zu schützen.Make sure that you use parameters in your query in the correct way to guard against such attacks.

Entitäten aus gespeicherten Prozeduren ladenLoading entities from stored procedures

Mit dbset. sqlQuery können Sie Entitäten aus den Ergebnissen einer gespeicherten Prozedur laden.You can use DbSet.SqlQuery to load entities from the results of a stored procedure. Der folgende Code ruft beispielsweise den dbo auf. Getblogs-Prozedur in der-Datenbank:For example, the following code calls the dbo.GetBlogs procedure in the database:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("dbo.GetBlogs").ToList();
}

Sie können Parameter auch an eine gespeicherte Prozedur übergeben, indem Sie die folgende Syntax verwenden:You can also pass parameters to a stored procedure using the following syntax:

using (var context = new BloggingContext())
{
    var blogId = 1;

    var blogs = context.Blogs.SqlQuery("dbo.GetBlogById @p0", blogId).Single();
}

Schreiben von SQL-Abfragen für nicht-Entitäts TypenWriting SQL queries for non-entity types

Eine SQL-Abfrage, die Instanzen eines beliebigen Typs zurückgibt, einschließlich primitiver Typen, kann mithilfe der sqlQuery-Methode für die Datenbankklasse erstellt werden.A SQL query returning instances of any type, including primitive types, can be created using the SqlQuery method on the Database class. Beispiel:For example:

using (var context = new BloggingContext())
{
    var blogNames = context.Database.SqlQuery<string>(
                       "SELECT Name FROM dbo.Blogs").ToList();
}

Die von sqlQuery für die Datenbank zurückgegebenen Ergebnisse werden nie vom Kontext nachverfolgt, auch wenn die Objekte Instanzen eines Entitäts Typs sind.The results returned from SqlQuery on Database will never be tracked by the context even if the objects are instances of an entity type.

Senden von rohbefehlen an die DatenbankSending raw commands to the database

Nicht-Abfrage Befehle können mithilfe der ExecuteSqlCommand-Methode für die Datenbank an die Datenbank gesendet werden.Non-query commands can be sent to the database using the ExecuteSqlCommand method on Database. Beispiel:For example:

using (var context = new BloggingContext())
{
    context.Database.ExecuteSqlCommand(
        "UPDATE dbo.Blogs SET Name = 'Another Name' WHERE BlogId = 1");
}

Beachten Sie, dass alle Änderungen, die an Daten in der Datenbank mithilfe von ExecuteSqlCommand vorgenommen werden, für den Kontext nicht transparent sind, bis Entitäten geladen oder aus der Datenbank erneut geladen werden.Note that any changes made to data in the database using ExecuteSqlCommand are opaque to the context until entities are loaded or reloaded from the database.

AusgabeparameterOutput Parameters

Wenn Output-Parameter verwendet werden, sind ihre Werte erst verfügbar, wenn die Ergebnisse vollständig gelesen wurden.If output parameters are used, their values will not be available until the results have been read completely. Dies ist auf das zugrunde liegende Verhalten von DbDataReader zurückzuführen. Weitere Informationen finden Sie unter Abrufen von Daten mithilfe eines DataReader .This is due to the underlying behavior of DbDataReader, see Retrieving Data Using a DataReader for more details.