Question

Ne pas ressembler à un disque cassé ici (il y a quelques articles qui ressemblent à celui-ci) mais aucun d'entre eux ne semble résoudre mon problème.Il semble que lorsque vous souhaitez mettre à jour

private bool resetPassword(string password)
{
    try
    {
       var db = new SchedulerDBDataContext();

       // since this is a instance method, I grab the ID from _this_
       AdminUser user = db.AdminUsers.SingleOrDefault(t => t.ID == _ID);

       if (user != null)
       {
           // this method DOES update these two fields.
           SchedUtil.md5Hash(password, ref user._EncryptedPassword, ref user._PasswordSalt);

           // I threw these in there to try something... it didn't work.
           //user._EncryptedPassword = user.EncryptedPassword;
           //user._PasswordSalt = user.PasswordSalt;

           // this DOESN'T do anything.
           db.SubmitChanges();
           return true;
       }

       return false;
    }
    catch (Exception)
    {
        return false;
    }
}

C'est peut-être une question stupide, mais je récupère this depuis la base de données ... pourquoi ne pas simplement mettre à jour les propriétés de this.Je suppose que je dois le faire passer par le DBContext, je suppose.

Était-ce utile?

La solution

Vous devez définir les propriétés publiques et non les valeurs privées.

  // I threw these in there to try something... it didn't work.
       //user._EncryptedPassword = user.EncryptedPassword;
       //user._PasswordSalt = user.PasswordSalt;

Cela ne déclenchera aucune mise à jour.

Même si vous le faites:

      user.EncryptedPassword = user._EncryptedPassword;
      user.PasswordSalt      = user._PasswordSalt;

cela ne déclenchera aucun changement non plus car vous ne modifiez pas réellement les valeurs

Vous pouvez faire quelque chose comme

 string newEncryptedPassword;
 string newPasswordSalt;

 SchedUtil.md5Hash(password, ref newEncryptedPassword, ref newPasswordSalt);

 user.EncryptedPassword = newEncryptedPassword;
 user.PasswordSalt      = newPasswordSalt;

Vérifiez également que votre table a une clé primaire, sinon Linq ne suivra pas les modifications.

Autres conseils

DJ,

Êtes-vous sûr

user._EncryptedPassword , 
user._PasswordSalt 

sont les propriétés?Je pense que LINQ TO SQL crée des propriétés publiques et privées.

Pouvez-vous les définir

user.EncryptedPassword , 
user.PasswordSalt

comme ça?

Ved

Pour résoudre les problèmes liés à votre code, essayez l'une de ces suggestions:

  • lors du débogage du code, je suppose que votre objet n'est pas nul.
  • assurez-vous que vos propriétés sont réellement modifiées.Il est étrange que vous utilisiez des noms de champs avec préfixe pipe, mais dans les deux cas: lors du débogage, vérifiez que vos propriétés ont réellement de nouvelles valeurs.
  • utilisez SQL Server Profiler pour capturer l'instruction SQL envoyée au serveur de base de données.Vous pourrez ensuite réexécuter cette requête UPDATE dans SQL Management Studio et déterminer le nombre d'enregistrements concernés.Vous pourrez également voir les valeurs transmises dans l'instruction UPDATE.

Ved a signalé un problème possible.Juste au cas où cela ne fonctionnerait pas, vous devriez vérifier la définition de la classe AdminUser de votre classe LINQ to SQL et vous assurer que le code généré implémente les interfaces INotifyPropertyChanging et INotifyPropertyChanged.Il existe certains cas où le concepteur n'implémentera pas ces interfaces, ce qui empêche les mises à jour de fonctionner.par exemple, ne pas déclarer de clé primaire.

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