2

Dans le constructeur de chacun de mes POCO de je ceci:Entités Auto Tracking - Suppression de la navigation Propriété ne dit pas réglé sur « supprimé »

this.StartTracking(); 

Pour vous assurer que le suivi est activé pour tous les cas d'un de mes POCO. J'ai une entité A qui contient une TrackableCollection de l'entité B. Quand je charge mon instance de l'entité A comme tel:

using(MyContext ctx = new MyContext()) 
{ 
    entityA = ctx.EntityA.Include("EntityB").Where(x => x.Id== id).FirstOrDefault(); 
} 

regardant la propriété ObjectsAddedToCollection sur l'entité A, il y a 1 objet marqué comme « Sans changement ». Lorsque je fais entityA.EntityB [0] .MarkAsDeleted(), l'état n'est pas défini sur 'Deleted' et déplacé vers la collection ObjectsRemovedFromCollection. Il est simplement supprimé complètement. J'ai vérifié deux fois et le ChangeTrackingEnabled a la valeur True pour l'Entité A et l'Entité B. Y a-t-il une raison pour laquelle cela ne fonctionne pas? Pour cette raison, je ne peux pas supprimer l'entité enfant et persister les modifications apportées à la base de données.

Répondre

2

Cela semble être un bug. Dans la méthode RecordRemovalFromCollectionProperties j'ai changé la ligne qui retourne simplement:

if(((IObjectWithChangeTracker) value).ChangeTracker.State == ObjectState.Added) 
    return; 

Ce fixe les problèmes que je rencontrais.

0

Plutôt dangereux en changeant ce code généré. Qu'est-ce que la méthode RecordRemovalFromCollectionProperties fait est de voir si il y a des objets ajoutés qui sont supprimés à nouveau (état final = aucune entité ajoutée ou supprimée, l'ajout et la suppression "se rejoignent", vous voyez ...?). C'est pourquoi il y a aussi un RecordAdditionToCollectionProperties qui fait la vérification "inverse" de ce que j'ai expliqué auparavant. Maintenant, avec votre changement à cette méthode du ChangeTracker, il est possible que vous ayez renvoyé un EntityA qui a un EntityB ajouté et un EntityB enlevé (qui sont les mêmes instances). Cela pourrait être fait par un utilisateur ou par le code d'une manière ou d'une autre.

Je ne sais pas si le contexte de l'objet le permettra dans un premier temps. Mais c'est au moins un peu inefecient. Envoi d'un jour qui dit l'Entité au contexte de l'objet (context.ApllyChanges(EntityA)) Ajouter ce et immédiatement après l'Entité, mwoah supprimer ce même aussi l'Entité;)

J'ai une certaine expérience dans ce domaine, donc si vous avez des questions ...

Je pense que le problème d'origine a une raison, mais que votre solution est un peu rude.