Requêtes SQL brutes (EF6)

Entity Framework vous permet d’interroger à l’aide de LINQ avec vos classes d’entité. Toutefois, il peut arriver que vous souhaitiez exécuter des requêtes à l’aide de SQL brut directement sur la base de données. Cela inclut l’appel de procédures stockées, qui peuvent être utiles pour les modèles Code First qui ne prennent actuellement pas en charge le mappage aux procédures stockées. Les techniques présentées dans cette rubrique s’appliquent également aux modèles créés avec Code First et EF Designer.

Écriture de requêtes SQL pour les entités

La méthode SqlQuery sur DbSet permet à une requête SQL brute d’être écrite qui retourne des instances d’entité. Les objets retournés seront suivis par le contexte tout comme s’ils étaient retournés par une requête LINQ. Par exemple:

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

Notez que, comme pour les requêtes LINQ, la requête n’est pas exécutée tant que les résultats ne sont pas énumérés, dans l’exemple ci-dessus, l’appel à ToList est effectué.

Il convient d'être prudent lors de l'écriture de requêtes SQL brutes pour deux raisons. Tout d’abord, la requête doit être écrite pour s’assurer qu’elle retourne uniquement des entités qui sont réellement du type demandé. Par exemple, lorsque vous utilisez des fonctionnalités telles que l’héritage, il est facile d’écrire une requête qui crée des entités qui sont du type CLR incorrect.

Deuxièmement, certains types de requêtes SQL brutes exposent des risques de sécurité potentiels, en particulier autour des attaques par injection SQL. Veillez à utiliser des paramètres dans votre requête de manière appropriée pour vous protéger contre ces attaques.

Chargement d’entités à partir de procédures stockées

Vous pouvez utiliser DbSet.SqlQuery pour charger des entités à partir des résultats d’une procédure stockée. Par exemple, le code suivant appelle la procédure dbo.GetBlogs dans la base de données.

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

Vous pouvez également passer des paramètres à une procédure stockée à l’aide de la syntaxe suivante :

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

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

Écriture de requêtes SQL pour les types non-entité

Une requête SQL retournant des instances de n’importe quel type, y compris les types primitifs, peut être créée à l’aide de la méthode SqlQuery sur la classe Base de données. Par exemple:

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

Les résultats retournés par SqlQuery sur la base de données ne seront jamais suivis par le contexte même si les objets sont des instances d’un type d’entité.

Envoi de commandes brutes à la base de données

Les commandes non-requête peuvent être envoyées à la base de données à l’aide de la méthode ExecuteSqlCommand sur la base de données. Par exemple:

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

Notez que les modifications apportées aux données de la base de données à l’aide d’ExecuteSqlCommand sont opaques dans le contexte jusqu’à ce que les entités soient chargées ou rechargées à partir de la base de données.

Paramètres de sortie

Si les paramètres de sortie sont utilisés, leurs valeurs ne seront pas disponibles tant que les résultats n’ont pas été lus complètement. Cela est dû au comportement sous-jacent de DbDataReader, consultez Récupération de données à l’aide d’un DataReader pour plus d’informations.