2009-06-29 8 views
3

J'essaie d'étendre les classes linqtosql générées par le concepteur VS et j'ai besoin de déterminer si la valeur d'un champ spécifique a changé. Est-il possible pour moi d'accéder aux valeurs avant et après pour un champ dans la méthode DataContext Update pour une table/entité?Implémentation de la classe linqtosql partielle DataContext - comment inspecter les valeurs avant/après

Voici mon code:

public partial class DataClassesDataContext 
{ 
    partial void UpdateActivity(Activity instance) 
    { 
     this.ExecuteDynamicUpdate(instance); 
     //need to compare before and after values to determine if instance.AssignedTo value has changed and take action if it has 
    } 
} 

Je suis aussi ouvert à l'ajout d'une propriété à la classe d'entité d'activité pour signaler si la valeur a changé, mais je ne peux pas comprendre comment dire si la valeur a changé là non plus. Je ne peux pas simplement utiliser la méthode OnAssignedToChanged de la classe Activity car elle se déclenche à chaque fois que la valeur de la propriété est définie, pas nécessairement modifiée. J'utilise le contrôle ListView et LINQDataSource pour la mise à jour afin qu'il soit défini, peu importe quoi.

Je pensais aussi pouvoir utiliser la méthode OnAssignedToChanging mais l'instance Activity ne semble pas avoir de valeurs actuelles à ce point. Le code suivant ne fonctionne pas comme ceci. AssignedTo est toujours null.

partial void OnAssignedToChanging(int? value) 
{ 
    if (value != this.AssignedTo) 
    { 
     _reassigned = true; 
    } 
} 

Répondre

9

Vous devriez être en mesure de le faire:

public partial class DataClassesDataContext 
{ 
    partial void UpdateActivity(Activity instance) 
    { 
     Activity originalActivity = Activities.GetOriginalEntityState(instance); 
     if (instance.Property != originalActivity.Property) 
     { 
      // Do stuff 
     } 
     this.ExecuteDynamicUpdate(instance); 
     //need to compare before and after values to determine if instance.AssignedTo value has changed and take action if it has 
    } 
} 

Une autre alternative:

public partial class DataClassesDataContext 
{ 
    partial void UpdateActivity(Activity instance) 
    { 
     ModifiedMemberInfo[] changes = Activities.GetModifiedMembers(instance); 
     foreach (var change in changes) 
     { 
      Console.WriteLine("Member: {0}, Orig: {1}, New: {2}", change.Member, change.OriginalValue, change.CurrentValue); 
     } 

     this.ExecuteDynamicUpdate(instance); 
     //need to compare before and after values to determine if instance.AssignedTo value has changed and take action if it has 
    } 
} 

Je viens de vérifier dans votre autre choix (OnAssignedToChanging(int? value)), et il semble fonctionner très bien pour moi. Êtes-vous sûr que la valeur initiale n'était pas réellement nulle? Je l'ai testé avec un nouvel objet ainsi qu'un extrait d'une base de données et il semble fonctionner correctement.

+0

méthode partielle? ;) – Kezzer

+0

Oui, je manque quelque chose? Des méthodes partielles ont été ajoutées dans .NET 3.5 - cherchez-les si vous êtes intéressé :) –

+0

Fondamentalement, une classe partielle peut avoir des méthodes partielles déclarées, mais pas définies. Vous pouvez ensuite les implémenter dans un fichier séparé. Si ce n'est pas le cas, cela fonctionne comme si tous les appels de méthode associés n'existaient pas. –

Questions connexes