Iliyass Hamza
Iliyass Hamza

Reputation: 1405

after entity update entity framework still gives me old info?

i have a strange problem, i'm building a Single Page Application with AngularJs and Web API in the server, I'm using Entity framework, i use Code First approach everything is going good, until i want to implement Change password for a user, the updating goes right, but when the user tries to reconnect with his new credentials, entity framework gather the old password !!

public class AuthenticationFilter : ActionFilterAttribute
{
    private  MyDbRepository repo;

    public KhbyraAuthenticationFilter()
    {
        repo = new MyDbRepository(new MyDbContext());
    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        //Login code accessing database by repo object !!
        //Here where Entity framework gather old info
    }
 }

Thats the login Action in SecurityController

[EnableCors("*", "*", "*")]
public class SecurityController : BaseApiController
{

   //other actions


    [AuthenticationFilter]
    [Route("Token")]
    [HttpPost]
    public IHttpActionResult Login([FromBody]User user)
    {
        if (user == null)
        {
            Unauthorized();
        }
        return Ok();

    }
}

Edit

this is where the change pass

[EnableCors("*", "*", "*")]
[KhbyraAuthorizeAttribute]
public class UserController : BaseApiController
{
    private int CurrentUserID;
    public UserController():base(new KhbyraRepository(new KhbyraContext()))
    {

    }
    //.. other actions
    //..


    [Route("User/ChangePassword")]
    [HttpPost]
    public IHttpActionResult ChangePassword([FromBody]ChangePasswordModel model)
    {
       // here where i save the new password

    }

Upvotes: 1

Views: 120

Answers (1)

Gert Arnold
Gert Arnold

Reputation: 109109

You must instantiate a new repository inside the OnActionExecuting method in AuthenticationFilter. The filter is a singleton so you're keeping one DbContext instance that has the old values cached.

public class AuthenticationFilter : ActionFilterAttribute
{
    public KhbyraAuthenticationFilter()
    {
    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        using(var repo = new MyDbRepository(new MyDbContext()))
        {
            //Login code accessing database by repo object.
        }
    }
 }

This also makes the code thread safe (which it isn't currently).

Upvotes: 1

Related Questions