Объект не обновляется в базе данных с использованием Entity Framework 6

#c# #entity-framework #asp.net-web-api #put

#c# #entity-framework #asp.net-web-api #поместите

Вопрос:

Я создаю API для своего приложения Xamarin для Android, и я создал этот метод для обновления пароля в базе данных:

 [HttpPut]
[ActionName("updatepassword")]
public HttpResponseMessage updatepassword(string password,string email)
{
    user_table user = dbe.user_table
                         .Where(x => x.email_address == email)
                         .FirstOrDefault();
    user.password_hash = password.GetHashCode();

    var response = dbe.SaveChanges();
    string finalresponse = "password updated successfully"   response;

    return Request.CreateResponse(HttpStatusCode.OK, finalresponse );
}
 

Но когда я тестирую его с помощью postman, он показывает, что 0 объектов были затронуты.

Я также пытался использовать

 dbe.user_table.AddorUpdate()
 

но это тоже не работает, пожалуйста, помогите мне.

Это мой запрос postman

 http://192.168.10.9:8044/api/account/updatepassword/?password=asad1234amp;email=asadregards@gmail.com
 

Я опубликовал свой API на сервере IIS, поэтому я использую IP-адрес вместо localhost.

Комментарии:

1. @marc_s вы должны были ответить на мой запрос после редактирования моего вопроса

2. Вероятно, состояние объекта не изменилось. Вы пытались использовать EntityStates ?

3. Если бы был очевидный ответ, я бы опубликовал его. Единственное, что очевидно, это то, что вы всегда должны проверять NULL после вызова .FirstOrDefault() перед любой дальнейшей операцией: if (user != null) { ...... } — в противном случае вы, возможно, попытаетесь установить password_hash и в итоге получите NullReferenceException

4. В каком состоянии EF сообщает, что объект находится перед вызовом SaveChanges ? Проверьте dbe.ChangeTracker.Entries()

5. @AsadUllah Не ожидайте чудес, по крайней мере, от нас, при публикации кода, в котором нет ничего явно неправильного и о котором вы не предоставляете никаких подробностей, например, то, что вы видите при его отладке.

Ответ №1:

Измените свой код на это:

 var user = dbe.user_table
            .Where(x => x.email_address == email)
             .FirstOrDefault();

var response=0;
if (user!=null)
{
   user.password_hash = password.GetHashCode();
 dbe.Entry(user).State = EntityState.Modified;

// Or you can try 
//dbe.Entry(user).Property(i => i.password_hash).IsModified = true;

    response = dbe.SaveChanges();
}
 
........
........

 

И, возможно, неплохо было бы также изменить заголовок API:

 [Route("updatepassword/{password}/{email}")]
public  IHttpActionResult updatepassword(string password,string email)
{
.........
.......
return response>0 ? Ok():BadRequest();

}
 

Комментарии:

1. Совсем не ясно, почему маркировка всего user объекта as Modified решила бы эту проблему. Это менее эффективно, потому что в исходном коде только user.password_hash должно быть помечено как измененное и обновленное. И если исходный код не работает, нет никаких оснований полагать, что этот ответ действительно решит проблему.

2. Как вы знаете, DB не может обновить только одно поле. Он всегда обновляет всю запись, а иногда и целые страницы записей.

3. Физические аспекты обновлений базы данных здесь неуместны. Логически необходимо обновить только одно поле. Здесь важнее всего то, что проблема не выяснена. Если это работает сейчас, это, вероятно, потому, что они изменили не только это.

4. Я внес некоторые изменения. Проверьте мой ответ, пожалуйста.