Comprendre le comportement par défaut d'Entity Framework : persistance des objets enfants
Lors de l'utilisation d'Entity Framework (EF), un mappage objet-relationnel (ORM) largement adopté ) pour .NET, il est crucial d'être conscient de son comportement concernant les entités enfants. Par défaut, EF suppose que lorsqu'une entité est enregistrée, tous les objets enfants associés doivent être enregistrés à côté d'elle. Cependant, cette action par défaut peut entraîner des conséquences indésirables, en particulier si vous avez l'intention d'ignorer la persistance des entités enfants.
Raisons pour exclure les entités enfants de la persistance
Vous pouvez rencontrer des scénarios où la sauvegarde des entités enfants n’est pas souhaitable. Par exemple, lorsque les données sont renseignées manuellement à partir de sources externes, telles que des fichiers plats, les entités existantes dans la base de données peuvent déjà remplir les rôles des entités enfants. L'insertion de doublons dans la base de données peut entraîner des problèmes d'incohérence et d'intégrité. De plus, enregistrer les entités enfants avant de leur attribuer une clé primaire peut entraver le bon fonctionnement d'EF.
Application de la persistance sélective : Unchanged EntityState
Pour relever le défi consistant à ignorer la persistance des entités enfants , vous pouvez tirer parti de l'option EntityState.Unchanged. En définissant explicitement l'état d'une entité enfant sur Unchanged, vous demandez à EF de l'ignorer lors de l'opération de sauvegarde.
Exemple de code utilisant EntityState.Unchanged
Considérez ce qui suit exemple de code, en supposant que vous ayez une entité École avec une entité enfant Ville :
public School Insert(School newItem) { using (var context = new DatabaseContext()) { context.Set<School>().Add(newItem); context.Entry(newItem.City).State = EntityState.Unchanged; context.SaveChanges(); return newItem; } }
En définissant l'état de l'entité Ville sur Inchangé, EF l'exclura de l'opération de sauvegarde, laissant la base de données inchangée. Cependant, cette approche nécessite de gérer manuellement l'affectation des entités enfants.
Solution alternative : utilisation de clés étrangères
Une solution plus élégante et flexible consiste à utiliser des clés étrangères. En définissant une propriété de clé étrangère au sein de votre entité enfant, vous spécifiez explicitement sa relation avec l'entité parent. EF gérera alors automatiquement l'état de l'entité associée en fonction de la référence fournie.
Exemple de code utilisant des clés étrangères
Voici une version mise à jour de l'exemple de code précédent utilisant des clés étrangères :
public class School { public int Id { get; set; } public string Name { get; set; } [ForeignKey("City_Id")] public City City { get; set; } [Required] public int City_Id { get; set; } } public School Insert(School newItem, int cityId) { using (var context = new DatabaseContext()) { // Set child entity to null to prevent insertion newItem.City = null; // Specify foreign key relationship without adding the child entity newItem.City_Id = cityId; context.Set<School>().Add(newItem); context.SaveChanges(); return newItem; } }
Dans ce cas, vous définissez manuellement le City_Id et annulez la référence City, en demandant à EF d'établir la connexion via le clé étrangère sans impliquer l’entité enfant. Cette approche simplifie le code et évite d'avoir à gérer manuellement EntityState.
Conclusion
Comprendre le comportement par défaut d'Entity Framework et utiliser les techniques appropriées, telles que EntityState.Unchanged ou utiliser des clés étrangères, permet aux développeurs de contrôler et de personnaliser la persistance des entités enfants, évitant ainsi les effets secondaires indésirables et garantissant l'intégrité des données au sein de leurs applications.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!