1

J'ai besoin de consigner les modifications apportées à une entité qui se produisent sur le client dans une table de base de données. Toutefois, lorsque j'apporte des modifications et inspecte la propriété ChangeTracker, il affirme qu'aucune modification ne s'est produite.Comment suivre les changements d'entité avec WCF Ria Services?

[Service]

private static readonly ISomeDao someDao = DataAccess.SomeDao; 
    [Query] 
    public List<SomeEntity> GetSomeEntites(int someId) 
    { 
     var entities = someDao.GetSomeEntites(someId); 
     entities.ForEach(e => e.StartTracking()); 
     return entities; 
    } 

    [Update] 
    public void UpdateSomeEntity(SomeEntity entity) 
    { 
     // inspect entity.ChangeTracker.OriginalValues.... nothing 
     entity.StopTracking(); 
     // inspect entity.ChangeTracker.OriginalValues.... nothing 
     ... 
     // Update log table 
    } 

[Client]

public EntitySet<SomeEntity> SomeEntities 
    { 
     get { return _someEntity; } 
     set 
     { 
      if (_someEntity!= value) 
      { 
       _someEntity= value; 
       OnPropertyChanged("SomeEntities"); 
      } 
     } 
    } 

Ainsi, si, entités autovirants et WCF Ria services ne peuvent pas vivre ensemble (ce qui est ce que je Je soupçonne), comment un track change-t-il?

+0

Avez-vous lu ma réponse? D'autres questions? bonne chance! –

Répondre

1

Ne fonctionne pas avec les services Ria mais uniquement avec WCF (ne sait pas si cela fait une grande différence ...). Tout d'abord, vous n'avez pas besoin d'exécuter la commande (côté serveur) pour démarrer le suivi des entités, cela se fait automatiquement avec la désérialisation par WCF. Deuxièmement, je sais que seules les propriétés de clé primaire et étrangère d'une entité de suivi SELF sont enregistrées lorsqu'elles sont modifiées. ce n'est pas le cas pour les entités NORMAL qui continuent à vivre dans un contexte d'entité (alors toutes les modifications sont enregistrées).

Si vous regardez de plus près un que vous pourriez voir quelque chose comme Self-Tracking-Entité ceci:

[DataMember] 
    public string Plaats 
    { 
     get { return _plaats; } 
     set 
     { 
      if (_plaats != value) 
      { 
       _plaats = value; 
       OnPropertyChanged("Plaats"); 
      } 
     } 
    } 
    private string _plaats; 

    [DataMember] 
    public int LandID 
    { 
     get { return _landID; } 
     set 
     { 
      if (_landID != value) 
      { 
       ChangeTracker.RecordOriginalValue("LandID", _landID); 
       if (!IsDeserializing) 
       { 
        if (Land != null && Land.ID != value) 
        { 
         Land = null; 
        } 
       } 
       _landID = value; 
       OnPropertyChanged("LandID"); 
      } 
     } 
    } 
    private int _landID; 

Voyez-vous la différence? entre la propriété simple Plaats et la propriété clé étrangère LandID? C'est dans la ligne `ChangeTracker.RecordOriginalValue (" LandID ", _landID);

Pour les propriétés simples, ces modifications ne sont pas enregistrées (les propriétés themseklves ne sont pas modifiées, de sorte que le contexte EF sait comment appliquer les modifications et mettre à jour la base de données).

idées possibles pourraient être:

  1. Pour personnaliser le modèle T4 pour enregistrer les valeurs d'origine pour chaque propriété
  2. Pour tirer toutes les entités d'une classe de base où l'on pouvait établir un certain cadre pour l'enregistrement des valeurs originales par répondre à des événements PropertyChanged
  3. Lors de la mise à jour des ENTITES, obtenir d'abord les valeurs d'origine de la base de données et de suivre les changements

J'espère que cela t'aides!