Partager via


Changements de comportement entre EF6 et EF Core

Il s’agit d’une liste non exhaustive des changements de comportement entre EF6 et EF Core. Il est important de les garder à l’esprit lors du port de votre application, car elles peuvent modifier son comportement, mais ne s’afficheront pas en tant qu’erreurs de compilation après le passage à EF Core.

Elle est conçue comme une évaluation de niveau élevé à envisager dans le cadre du processus de portage. Pour obtenir des instructions au cas par cas plus détaillées, lisez les cas détaillés.

DbSet. Add/Attach et le comportement du graphique

Dans EF6, appeler DbSet.Add() sur une entité entraîne une recherche récursive pour toutes les entités référencées dans ses propriétés de navigation. Toutes les entités qui sont détectées et ne sont pas déjà suivies par le contexte sont également marquées comme ajoutées. DbSet.Attach() se comporte de la même manière, sauf que toutes les entités sont marquées comme inchangées.

EF Core effectue une recherche récursive similaire, mais avec des règles légèrement différentes.

  • Si l’entité racine est configurée pour une clé générée et que la clé n’est pas configurée, elle est mise dans l’état Added.
  • Pour les entités qui sont détectées lors de la recherche récursive des propriétés de navigation :
    • Si la clé primaire de l’entité est générée par le magasin
      • Si la clé primaire n’est pas définie sur une valeur, l’état est défini sur ajouté. La valeur de clé primaire est considérée comme « non définie » si elle est affectée à la valeur CLR par défaut pour le type de propriété (par exemple, 0 pour int, null pour string, etc.).
      • Si la clé primaire n’est pas définie sur une valeur, l’état est défini sur inchangé.
    • Si la clé primaire n’est pas générée par la base de données, l’entité est mise dans le même état que la racine.
  • Ce changement de comportement s’applique uniquement aux groupes de méthodes Attach et Update. Add met toujours des entités dans l’état Added, même en cas de configuration de la clé.
  • Les méthodes Attach mettent des entités disposant de clés dans l’état Unchanged. Cette opération facilite « insert it if new, otherwise leave it alone. » («l’insérer si nouvelle, sinon la laisser seule »). Les méthodes Update mettent des entités disposant de clés dans l’état Modified. Cela facilite « insert it if new, otherwise leave it alone. »

La ligne générale ici est que Update est une façon très simple de gérer des insertions et des mises à jour d’entités déconnectées. Cela permet l’insertion de nouvelles entités et toute nouvelle entité existante est mise à jour.

En même temps, Add fournit toujours une façon facile pour forcer l’insertion d’entités. Ajouter est principalement utile dans le seul cas de la non utilisation de clés générées par le magasin, de sorte qu’EF ne sait pas si l’entité est nouvelle ou pas.

Pour obtenir plus d’informations sur ces comportements dans EF Core, consultez Suivi des modifications dans EF Core.

Initialisation de la base de données Code First

EF6 dispose d’un grand nombre de commandes magic exécutées dans le contexte de la sélection de la connexion de base de données et de l’initialisation de la base de données. Voici quelques-unes de ces règles :

  • Si aucune configuration n’est effectuée, EF6 sélectionne une base de données sur SQL Express ou sur une base de données locale.
  • Si une chaîne de connexion portant le même nom que le contexte se trouve dans le fichier App/Web.config de l’application, cette connexion est utilisée.
  • Si la base données n’existe pas, elle est créée.
  • Si aucune des tables du modèle n’existe dans la base de données, le schéma du modèle actuel est ajouté à la base de données. Si les migrations sont activées, elles sont utilisées pour créer la base de données.
  • Si la base de données existe et qu’EF6 a créé le schéma précédemment, la compatibilité du schéma avec le modèle actuel est vérifiée. Une exception est levée si le modèle a changé depuis la création du schéma.

EF Core n’exécute aucun de ces magics.

  • La connexion de base de données doit être configurée de manière explicite dans le code.
  • Aucune initialisation n’est effectuée. Vous devez utiliser DbContext.Database.Migrate() pour appliquer des migrations (ou DbContext.Database.EnsureCreated() et EnsureDeleted() pour créer/supprimer la base de données sans utiliser les migrations).

Convention d’affectation de noms de la table Code First

EF6 exécute le nom de la classe d’entité via un service de pluralisation pour calculer le nom de la table par défaut à laquelle l’entité est mappée.

EF Core utilise le nom de la propriété DbSet dans laquelle l’entité est exposée dans le contexte dérivé. Si l’entité n’a pas de propriété DbSet, le nom de la classe est utilisé.

Pour obtenir plus d’informations, consultez Gestion des schémas de base de données.