La mise en œuvre de la classe DataContext LinqToSql partielle - comment inspecter avant / après des valeurs

StackOverflow https://stackoverflow.com/questions/1058583

  •  21-08-2019
  •  | 
  •  

Question

Je suis en train d'étendre les classes LinqToSql générées par le concepteur VS et doivent déterminer si la valeur d'un champ spécifique a changé. Est-il possible pour moi d'accéder à l'avant et après les valeurs d'un champ dans la méthode de mise à jour DataContext pour une table / entité?

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é non plus. Je ne peux pas utiliser la méthode OnAssignedToChanged de la classe d'activité, car il se déclenche chaque fois que la valeur de la propriété est définie, pas nécessairement changé. J'utilise le contrôle ListView et LinqDataSource pour la mise à jour de sorte qu'il se prépare quoi qu'il arrive.

J'ai aussi pensé que je pourrais être en mesure d'utiliser la méthode de OnAssignedToChanging mais l'instance d'activité ne semble pas avoir des valeurs actuelles à ce moment-là. Le code suivant ne fonctionne pas comme this.AssignedTo est toujours nulle.

partial void OnAssignedToChanging(int? value)
{
   if (value != this.AssignedTo)
   {
      _reassigned = true;
   }
}
Était-ce utile?

La solution

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. Etes-vous sûr de la valeur initiale était pas vraiment nulle? Je l'ai testé avec un nouvel objet ainsi qu'un tiré à partir d'une base de données et il semble fonctionner correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top