LINQ: SubmitChanges () ne met pas à jour mon enregistrement
-
29-10-2019 - |
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.
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.