Exécution directe de commandes de stockage

Avec Entity Framework , vous pouvez exécuter directement des commandes de source de données arbitraire.

La commande de stockage est exécutée dans le contexte de la transaction actuelle, si une telle transaction existe. Si la connexion via l'objet ObjectContext n'est pas ouverte avant l'appel à l'une des méthodes suivantes, Entity Framework ouvre la connexion avant d'exécuter la requête et la ferme une fois l'exécution de la requête terminée. Pour obtenir des informations sur l'exécution des requêtes, consultez Requêtes d'objet (Entity Framework). Les méthodes suivantes appartiennent au type ObjectContext ; pour obtenir des exemples d'utilisation de ces méthodes, consultez Procédure : exécuter directement des commandes sur la source de données.

Matérialisation du type de résultat

Pour les méthodes précédentes qui prennent un paramètre de type de résultat générique, TResult peut être un type primitif, un type d'entité ou tout type personnalisé. Le type n'a pas besoin d'être défini dans le modèle conceptuel Entity Framework . Si le type spécifié est d'un type qui n'est pas défini dans le modèle conceptuel ou n'est pas un type primitif, les conventions de mappage suivantes s'appliquent.

Le type :

  • ne doit pas être abstrait ;

  • doit disposer d'un constructeur par défaut.

Chaque propriété du type :

  • doit disposer d'un accesseur Set ;

  • doit correspondre à un type primitif dans le langage CSDL ;

  • doit correspondre à un nom de colonne dans l'objet DbDataReader résultant (l'implémentation du fournisseur détermine si une colonne a le même nom que la propriété). Si le nom de la propriété du type ne correspond pas à un champ de l'objet DbDataReader, Entity Framework matérialise la valeur par défaut de la propriété si elle est définie dans le modèle conceptuel.

Utilisation de commandes paramétrables

Les commandes paramétrables permettent de se prémunir contre les attaques par injection de code SQL, où une commande est « injectée » dans une instruction SQL et compromet la sécurité sur le serveur. Les commandes paramétrables protègent contre une attaque par injection de code SQL en garantissant que les valeurs reçues à partir d'une source externe sont passées en tant que valeurs uniquement et non pas comme partie intégrante de l'instruction SQL. Par conséquent, les commandes SQL insérées dans une valeur ne sont pas exécutées au niveau de la source de données. Au lieu de cela, les valeurs sont évaluées uniquement comme valeurs de paramètre. Outre les avantages en termes de sécurité, les commandes paramétrables constituent une méthode pratique pour organiser les valeurs passées avec une instruction SQL ou à une procédure stockée.

Lorsque vous appelez la méthode ExecuteStoreCommand ou l'une des surcharges ExecuteQuery (ExecuteStoreQuery ou ExecuteStoreQuery) et que vous passez les arguments commandText et parameters, Entity Framework génère une nouvelle instance DbCommand en utilisant la connexion du contexte de l'objet actuelle et affecte à la propriété CommandText ** la valeur commandText et à la propriété Parameters la valeur parameters. La valeur de parameters peut être un tableau d'objets DbParameter ou un tableau de valeurs de paramètres. Si seules des valeurs sont fournies, un tableau d'objets DbParameter est créé en fonction de l'ordre des valeurs dans le tableau. Le fournisseur sous-jacent détermine la propriété DbType appropriée de l'objet paramètre en fonction du type du common language runtime (CLR). La propriété ParameterName de chaque objet paramètre est construite selon le modèle suivant : « pn » où n est l'ordinal commençant par un de l'argument de paramètre.

Par exemple, les deux appels de méthode suivants sont équivalents :

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 });

Voir aussi

Tâches

Procédure : exécuter directement des commandes sur la source de données