LINQ: SubmitChanges () не обновляет мою запись - PullRequest
2 голосов
/ 05 февраля 2011

Не похоже, что здесь сломанная запись (есть несколько сообщений, похожих на эту), но ни одна из них, похоже, не решила мою проблему. Кажется, что когда вы хотите обновить

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;
    }
}

Возможно, это глупый вопрос, но я извлекаю this из БД ... почему бы просто не обновить свойства this. Я думаю, мне нужно вытащить это через DBContext Я думаю.

Ответы [ 4 ]

4 голосов
/ 05 февраля 2011

Вы должны устанавливать публичные свойства, а не приватные значения.

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

Это не вызовет обновлений.

Даже если вы сделаете:

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

, это не вызовет никаких изменений, так как вы на самом деле не являетесьизменение значений

Вы можете сделать что-то вроде

 string newEncryptedPassword;
 string newPasswordSalt;

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

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

Также проверьте, что у вашей таблицы есть первичный ключ, иначе Linq не будет отслеживать изменения.

3 голосов
/ 05 февраля 2011

DJ

Вы уверены, что

user._EncryptedPassword , 
user._PasswordSalt 

это свойства? Я думаю, что вы LINQ TO SQL создает открытые и закрытые свойства.

Можете ли вы установить их

user.EncryptedPassword , 
user.PasswordSalt

как это?

Ved

0 голосов
/ 05 февраля 2011

Вед указал на одну возможную проблему. На всякий случай, если это не сработает, вам следует дважды проверить определение класса AdminUser класса LINQ to SQL и убедиться, что сгенерированный код реализует интерфейсы INotifyPropertyChanging и INotifyPropertyChanged. В некоторых случаях дизайнер не реализует эти интерфейсы, что препятствует работе обновлений. например, не объявлять первичный ключ.

0 голосов
/ 05 февраля 2011

Чтобы устранить неполадки в вашем коде, попробуйте любое из следующих предложений:

  • во время отладки кода я предполагаю, что ваш объект не равен нулю.
  • убедитесь, что ваши свойства действительно изменены. Странно, что вы используете имена полей с префиксом канала, но в любом случае: во время отладки убедитесь, что ваши свойства действительно имеют новые значения.
  • использовать SQL Server Profiler для захвата оператора SQL, отправленного на сервер базы данных. После этого вы сможете повторно выполнить этот запрос UPDATE обратно в SQL Management Studio и определить, сколько записей выполнено. Вы также сможете увидеть значения, переданные в инструкции UPDATE.
...