Linq: submitchanges () no actualizando mi registro
-
29-10-2019 - |
Pregunta
No para sonar como un disco roto aquí (allí algunas publicaciones que se ven así) pero ninguna de ellas parece resolver mi problema. Parece que cuando quieres actualizar
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;
}
}
Tal vez esta sea una pregunta tonta pero estoy recuperando this
de la DB ... ¿Por qué no solo actualizar this
Propiedades. Supongo que necesito atravesarlo DBContext
Supongo.
Solución
Debe establecer las propiedades públicas y no los valores privados.
// I threw these in there to try something... it didn't work.
//user._EncryptedPassword = user.EncryptedPassword;
//user._PasswordSalt = user.PasswordSalt;
Esto no activará ninguna actualización.
Incluso si lo haces:
user.EncryptedPassword = user._EncryptedPassword;
user.PasswordSalt = user._PasswordSalt;
Esto tampoco activará ningún cambio, ya que realmente no está cambiando los valores
Puedes hacer algo como
string newEncryptedPassword;
string newPasswordSalt;
SchedUtil.md5Hash(password, ref newEncryptedPassword, ref newPasswordSalt);
user.EncryptedPassword = newEncryptedPassword;
user.PasswordSalt = newPasswordSalt;
También verifique que su tabla tenga una clave primaria; de lo contrario, Linq no rastreará los cambios.
Otros consejos
DJ,
Está seguro
user._EncryptedPassword ,
user._PasswordSalt
son las propiedades? Creo que Linq a SQL crea propiedades públicas y privadas.
¿Puedes configurarlos?
user.EncryptedPassword ,
user.PasswordSalt
como esto ?
Ved
Para solucionar problemas de su código, pruebe cualquiera de estas sugerencias:
- Al depurar el código, asumiré que su objeto no es nulo.
- Asegúrese de que sus propiedades realmente se cambien. Es extraño que esté utilizando nombres de campo prefijados por tuberías, pero de cualquier manera: mientras depuración, verifique que sus propiedades realmente tengan nuevos valores.
- Use SQL Server Profiler para capturar la instrucción SQL enviada al servidor de la base de datos. Luego podrá volver a ejecutar esta consulta de actualización en SQL Management Studio y determinar cuántos registros se efectúan. También podrá ver los valores aprobados en la declaración de actualización.
Ved señaló un posible problema. En caso de que eso no funcione, debe verificar su clase LINQ a SQL ' AdminUser
Definición de clase y asegúrese de que el código generado implementa el INotifyPropertyChanging
y INotifyPropertyChanged
interfaces. Hay algunos casos en los que el diseñador no implementará estas interfaces que evitan que las actualizaciones funcionen. Por ejemplo, no declarar una clave primaria.