c# - Entity Framework not refreshing data when using Repository Pattern -


i using repository , unit of work patterns , dependency injection access database entity framework 5 in web application. have user class entity framework generates code-first database.

public class user {     public guid userid { get; set; }     public string username { get; set; }               .               .               .     public string languagepreference { get; set; }     public virtual list<role> roles { get; set; }     public virtual list<branch> branches { get; set; }  } 

i have userservice class used add or update users. class takes iuserunitofwork parameter in constructor , unity injects userunitofwork. iuseruserofwork contains irepository<user>, irepository<location> , irepository<role>. these set repository<t> di bootstrapper. iuserunitofwork sets different repositories same entity framework dbcontext. did having issues updating many-to-many relationships related user (locations , roles).

userunitofwork:

   public irepository<branch> branchrepository {get; set;}    public irepository<role> rolerepository { get; set; }    public irepository<user> userrepository { get; set; }    public dbcontext context { get; set; }     public userunitofwork(dbcontext context, itransienterrordetectionstrategy errordetectionstrategy,retrystrategy retrystrategy )    {        context = context;        branchrepository = new repository<branch>(context, errordetectionstrategy, retrystrategy);        rolerepository = new repository<role>(context, errordetectionstrategy, retrystrategy);        userrepository = new repository<user>(context, errordetectionstrategy, retrystrategy);    } 

the repository class uses entity framework 5 access database.

example of method repository.firstordefault:

   public virtual t firstordefault(expression<func<t, bool>> filter = null, func<iqueryable<t>, iorderedqueryable<t>> orderby = null, string includeproperties = "")     {         t result = null;          _retrypolicy.executeaction(() =>         {             iqueryable<t> entities = gethelper(filter, orderby, includeproperties);              result = entities.firstordefault();         });           return result;     } 

and update repository:

    public virtual void update(t entity)     {         if (_dbcontext.entry(entity).state == system.data.entitystate.detached)         {             _dbcontext.set<t>().attach(entity);             _dbcontext.entry(entity).state = system.data.entitystate.modified;         }     } 

so problem when update user correctly updates data in database, , when log out , log in initial change works. if update again , log out , in new change isn't picked though database updated.

i'm beginning fear approach i've taken incorrect, can tell me how make sure when update entity framework latest version?

edit:

so i've created per request lifetime manager so:

public class perhttprequestlifetimemanager : lifetimemanager {     private readonly object key = new object();      public override object getvalue()     {         if (httpcontext.current != null &&             httpcontext.current.items.contains(key))             return httpcontext.current.items[key];         else             return null;     }      public override void removevalue()     {         if (httpcontext.current != null)             httpcontext.current.items.remove(key);     }      public override void setvalue(object newvalue)     {         if (httpcontext.current != null)             httpcontext.current.items[key] = newvalue;     } } 

in di bootstrapper setup domain context below:

        container.registertype<dbcontext, domaincontext>(new perhttprequestlifetimemanager()); 

it still doesn't appear working, missing else or setting incorrectly?

edit 2:

just point out architecture:

we have mvc application uses angular js make ajax calls web api service layer. web api has isomethingservice injected it. isomethingservice has repositories injected it. there confusion perhttprequestlifetimemanager since there both mvc , web api project running?

edit 3:

an example of how saving edited user:

we have usermodel class used communications between servicelayer -> api -> ui layer , back. user class 1 generated entity framework code first. edituser method in userservice takes in usermodel.

i user _unitofwork.userrepository corresponding database user

var editeduser = _unitofwork.userrepository.firstordefault(x => x.userid == usermodel.userid);  

i map fields usermodel editeduser , call (in userservice)

_unitofwork.userrepository.update(editeduser) 

and after

_unitofwork.save() 

yet edit:

so have edited simple method updates single text field on user table (language preference). explicitly call dispose method after update ensure disposing method.

   public void setuserlanguagepreference(guid userid, string language)     {         var user = _unitofwork.userrepository.firstordefault(x => x.userid == userid);          user.languagepreference = language;          _unitofwork.userrepository.update(user);         _unitofwork.save();         _unitofwork.dispose();     } 

unitofwork.dispose() calls dispose method of repositories , dbcontext

the database updates correctly. behaviour still incorrect. when log out , in first retrieves correct value. when change again , log out , in again doesn't update. has been pattern before, first update after log out , in, if change again , log out , in doesn't pick up.

finally, not edit answer! use claims based authentication , have class overrides claimsprinciple authenticate method called whenever user authenticated.

    public override claimsprincipal authenticate(string resourcename, claimsprincipal incomingprincipal)     {         if (incomingprincipal.identity.isauthenticated)         {             //check here if authenticated user has access system             //using user repository , if add more claims token         }         return base.authenticate(resourcename, incomingprincipal);     } 

it not possible inject method using di went empty constructor (not sure why that's way is).

so instead setting repository in empty constructor so:

    public prauthenticationmanager()     {         _userrepository = dibootstrapper.container.resolve<irepository<user>>();     } 

when authenticate method called check our database user claims attached claimsprincipal. if make match add new claims token used each call web api later. repository not being disposed (even if others were) , when user logged out , in got data same context had not been disposed last time user logged in.

three full days trying find one....


Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -