Utilisation des entités de suivi automatique
Dans une application Entity Framework , le suivi des modifications apportées aux entités dans un graphique d'objet est assuré par le contexte de l'objet. Toutefois, le contexte de l'objet risque de ne pas être disponible sur la couche qui modifie les entités, dans les scénarios multicouches. À partir de la version 4 du .NET Framework, les entités de suivi automatique peuvent vous aider à effectuer le suivi des modifications dans toutes les couches.
Remarque : |
---|
Utilisez les entités de suivi automatique uniquement si le contexte de l'objet n'est pas disponible sur la couche où les modifications sont apportées au graphique d'objet. Si le contexte de l'objet est disponible, utilisez les types dérivés EntityObject ou les types d'objets CLR « traditionnels » (POCO), ou les types de proxy POCO. Pour plus d'informations, consultez Utilisation d'objets (Entity Framework). |
Le modèle Générateur d'entité de suivi automatique ADO.NET génère des entités de suivi automatique à partir de Microsoft Visual Studio 2010. Cet élément de modèle génère deux fichiers .tt (modèle de texte) : <nom du modèle>.tt et <nom du modèle>.Context.tt. Le fichier *<nom du modèle>.*tt génère les types d'entité et une classe d'assistance qui contient la logique de suivi des modifications utilisée par les entités de suivi automatique et les méthodes d'extension permettant de définir l'état sur les entités de suivi automatique. Le fichier <nom du modèle>.Context.tt génère un ObjectContext typé et une classe d'extension qui contient les méthodes ApplyChanges pour les classes ObjectContext et ObjectSet. Ces méthodes examinent les informations de suivi des modifications contenues dans le graphique des entités de suivi automatique pour déduire l'ensemble des opérations à effectuer pour enregistrer les modifications dans la base de données. Pour plus d'informations, consultez ADO.NET Self-Tracking Entity Generator Template.
Remarque : |
---|
Un service ne doit pas compter sur les requêtes pour récupérer ou mettre à jour les données d'un client non approuvé ou via un canal non approuvé. Un client doit être authentifié : un canal sécurisé doit être utilisé ou bien une enveloppe de message. Les requêtes de clients pour mettre à jour ou récupérer des données doivent être validées pour vérifier qu'elles sont conformes aux modifications attendues et légitimes pour le scénario donné. |
Remarque : |
---|
Évitez d'utiliser des informations sensibles comme clés d'entité (par exemple, des numéros de sécurité sociale). Cela limite l'éventualité de sérialiser par inadvertance des informations sensibles dans les graphiques d'entité de suivi automatique sur un client qui n'est pas d'un niveau de confiance suffisant. Avec les associations indépendantes, la clé d'origine d'une entité associée à celle qui est sérialisée peut être également envoyée au client. |
Méthodes d'extension d'entité de suivi automatique
Les méthodes d'extension suivantes peuvent être appliquées à une entité de suivi automatique. Si vous souhaitez effectuer ces opérations sur un jeu d'entités au lieu d'une seulement, consultez Utilisation des jeux d'entités de suivi automatique pour plus d'informations.
Méthode StartTracking
La méthode StartTracking indique au traceur de modifications sur l'entité de commencer à enregistrer toutes les modifications appliquées à l'entité. Cela inclut les modifications apportées aux propriétés scalaires, aux collections et aux références à d'autres entités. Les entités de suivi automatique commencent à effectuer le suivi automatique lorsqu'elles sont désérialisées dans le client via Windows Communication Foundation (WCF). Le suivi est également activé pour les entités nouvellement créées dans les scénarios suivants :
Une relation est créée entre la nouvelle entité et une entité qui suit déjà les modifications.
La méthode MarkAs[State] ou AcceptChanges est appelée sur une entité.
Méthode StopTracking
La méthode StopTracking cesse d'enregistrer des modifications.
Méthodes MarkAs
Toutes les méthodes MarkAs activent le suivi. Ces méthodes d'extension facilitent la modification explicite de l'état d'une entité en Added, Modified, Deleted et Unchanged.
Les méthodes MarkAs[State] retournent l'entité à laquelle elles s'appliquent, avec son état modifié. L'exemple suivant modifie l'état de l'entité en Unchanged :
department.Course = new Course { CourseID = courseID }.MarkAsUnchanged();
La méthode MarkAsAdded modifie l'état de l'entité en Added. Les nouvelles entités de suivi automatique sont créées dans l'état Added avec le suivi des modifications désactivé.
La méthode MarkAsDeleted modifie l'état de l'entité en Deleted. Cette méthode efface également les propriétés de navigation de l'entité marquée pour suppression. La propriété de navigation a la valeur Null si elle pointe vers un objet de référence. La méthode Clear est appelée si la propriété représente une collection. Lorsque MarkAsDeleted est appelée sur un objet qui fait partie d'une collection, cet objet est supprimé de la collection. Pour marquer chaque objet d'une collection comme supprimé, marquez les objets dans une copie de la collection. Pour obtenir une copie de la collection, appelez la méthode ToArray() ou ToList() sur la collection, comme dans l'exemple suivant :
List<Course> courses = department.Courses.ToList();
foreach (var c in courses)
{
// Mark each course in the department as Deleted.
c.MarkAsDeleted();
}
La méthode MarkAsModified modifie l'état de l'entité en Modified. Lorsque la valeur d'une propriété sur une entité avec le suivi des modifications activé est modifiée, cela affecte également à l'état la valeur Modified.
La méthode MarkAsUnchanged modifie l'état de l'entité en Unchanged. AcceptChanges efface également les informations de suivi des modifications pour une entité et passe son état en Unchanged.
AcceptChanges
La méthode AcceptChanges efface les informations de suivi des modifications pour une entité et modifie son état en Unchanged. Si vous souhaitez réinitialiser l'état d'une relation, appelez AcceptChanges sur les deux entités qui participent à la relation.
Méthodes d'extension ObjectContext
La méthode ApplyChanges examine les informations de suivi des modifications contenues dans le graphique des entités de suivi automatique et déduit l'ensemble des opérations à effectuer pour refléter les modifications dans la base de données. Il existe deux méthodes ApplyChanges, une pour ObjectContext et l'autre pour ObjectSet.
Remarque : |
---|
Pour éviter la propagation de messages d'exception qui contiennent des données sensibles à la couche cliente, les appels à ApplyChanges et SaveChanges sur la couche serveur doivent être encapsulés dans le code de gestion des exceptions. |
Points à prendre en considération lors de l'utilisation d'entités de suivi automatique
Tenez compte des éléments suivants lors de l'utilisation d'entités de suivi automatique :
Assurez-vous que votre projet client possède une référence à l'assembly contenant les types d'entités. Si vous ajoutez uniquement la référence de service au projet client, celui-ci utilisera les types de proxy WCF et non les types réels d'entité de suivi automatique. Cela signifie que vous n'aurez pas accès aux fonctionnalités de notification automatisée qui gèrent le suivi des entités sur client. Si vous ne souhaitez pas inclure les types d'entités, vous devrez définir manuellement les informations de suivi des modifications sur le client pour les modifications à renvoyer au service.
Les appels aux opérations de service doivent être sans état et créer une nouvelle instance du contexte de l'objet. Nous vous recommandons également de créer un contexte de l'objet dans un bloc using.
Lorsque vous envoyez le graphique modifié sur le client au service, et que vous souhaitez continuer à utiliser le même graphique sur le client, vous devez effectuer une itération manuelle au sein du graphique, puis appeler la méthode AcceptChanges sur chaque objet pour réinitialiser le traceur de modifications. Si les objets dans votre graphique contiennent des propriétés avec des valeurs générées par la base de données (par exemple, des valeurs d'identité ou de concurrence), le Entity Framework remplace les valeurs de ces propriétés par les valeurs générées par la base de données après l'appel de la méthode SaveChanges. Vous pouvez implémenter votre opération de service pour retourner des objets enregistrés ou une liste de valeurs de propriété générées pour les objets au client. Le client devra ensuite remplacer les instances d'objet ou valeurs de propriété d'objet par les objets ou valeurs de propriété retournés à partir de l'opération de service.
La fusion de graphiques à partir de plusieurs demandes de service peut introduire des objets avec des valeurs de clés dupliquées dans le graphique résultant. Le Entity Framework ne supprime pas les objets avec des clés en double lorsque vous appelez la méthode ApplyChanges, mais lève une exception. Pour éviter d'obtenir des graphiques avec des valeurs de clés dupliquées, suivez un des modèles décrits dans le blog suivant : Suivi automatique d'entités : ApplyChanges et entités en double.
Lorsque vous modifiez la relation entre les objets en définissant la propriété de clé étrangère, la propriété de navigation de référence a la valeur Null et n'est pas synchronisée sur l'entité principale appropriée sur le client. Une fois le graphique attaché au contexte de l'objet (par exemple, après que vous avez appelé la méthode ApplyChanges), les propriétés de clé étrangère et les propriétés de navigation sont synchronisées.
Le fait que la propriété de navigation de référence ne soit pas synchronisée avec l'objet principal approprié peut poser un problème si vous avez spécifié la suppression en cascade dans la relation de clé étrangère. Si vous supprimez l'objet principal, la suppression ne sera pas propagée aux objets dépendants. Si vous avez spécifié des suppressions en cascade, utilisez les propriétés de navigation pour modifier les relations au lieu de définir la propriété de clé étrangère.
Les entités de suivi automatique ne sont pas activées pour effectuer un chargement différé.
La sérialisation binaire et la sérialisation en objets de gestion d'état ASP.NET ne sont pas prises en charge par le code généré à partir du modèle Générateur d'entité de suivi automatique ADO.NET. Toutefois, vous pouvez personnaliser le modèle pour ajouter la prise en charge de la sérialisation binaire. Pour plus d'informations, consultez Utilisation de la sérialisation binaire et de ViewState avec les entités de suivi automatique.
Voir aussi
Tâches
Procédure pas à pas : sérialiser des entités de suivi automatique (Entity Framework)
Autres ressources
Utilisation des jeux d'entités de suivi automatique
Entités de suivi automatique dans Silverlight
Utilisation de la sérialisation binaire et de ViewState avec les entités de suivi automatique