2013-04-14 7 views
-1

저장소 + unti od 작업 패턴을 사용하여 내 EF 함께 이상한 동작이 있습니다.asp.net 4.5 엔터티 프레임 워크

문제는 내가 사용자를 생성하고 그에게 역할, 대상 페이지에 리디렉션을 할당 할 때 내가 GetRolesForUser를 오버라이드 (override) 내 RoleProvider에서, 그래서 특정 역할을 필요로한다는 것입니다 :

public override string[] GetRolesForUser(string username) 
{ 

    string[] listRoles = unitOfWork.RoleRepository.Find(r => r.Utilisateurs.Any(u => u.Login == username)).ToList().Select(r => r.Nom).ToArray<string>(); 



    return listRoles; 
} 

에서 이 순간 데이터베이스의 사용자는 이미 생성되었지만 자신의 역할은 나타나지 않습니다.

나는이 새로운 버전으로 코드를 변경 :

public override string[] GetRolesForUser(string username) 
{ 
    string[] listRoles; 

    Utilisateur user = unitOfWork.UtilisateurRepository.Find(u => u.Login == username).FirstOrDefault(); 

    if (user != null) 
     listRoles = user.Roles.Select(r => r.Nom).ToList().ToArray(); 
    else 
    { 
     listRoles = new string[1]; 
     listRoles[0] = ""; 
    } 


    return listRoles; 
} 

는 정보를, 나는 요청에 따라 작업 단위를 사용합니다. 모두는 MembershipProvider 및 RoleProvider 클래스

, 내가 사용
private IUnitOfWork unitOfWork = new UnitOfWork(); 

내 DAL에서

내가 일반적인 저장소를 사용

public class GenericRepository<T> : IRepository<T> where T : class 
{ 
    internal DVEntities context; 
    internal IDbSet<T> dbset; 


    public GenericRepository(DVEntities context) 
    { 
     this.context = context; 
     this.dbset = context.Set<T>(); 
    } 
    public IUnitOfWork UnitOfWork 
    { 
     get; 
     set; 
    } 

    public IQueryable<T> All() 
    { 
     return dbset.AsQueryable(); 
    } 

    //public IQueryable<T> Find(Func<T, bool> expression) 
    public IQueryable<T> Find(Func<T, bool> expression) 
    { 
     return dbset.Where(expression).AsQueryable(); 
    } 

    public void Add(T entity) 
    { 
     dbset.Add(entity); 
    } 

    public void Attach(T entity) 
    { 
     dbset.Attach(entity); 
    } 

    public void Detach(T entity) 
    { 
     ((IObjectContextAdapter)context).ObjectContext.Detach(entity);    
    } 

    public void Delete(T entity) 
    { 
     if (context.Entry(entity).State == EntityState.Detached) 
     { 
      dbset.Attach(entity); 
     } 
     dbset.Remove(entity); 
    } 

    public void Update(T entityToUpdate) 
    { 
     dbset.Attach(entityToUpdate); 
     //dbset.Add(entityToUpdate); 

     context.Entry(entityToUpdate).State = EntityState.Modified; 
    } 

    public void Save() 
    { 
     context.SaveChanges(); 
    } 
} 

사람이 나에게 문제를하시기 바랍니다 설명 할 수 있습니까?

감사합니다.

+1

나는 정확하게 당신의 질문을 이해하지 못한다. (정확히 작동하지 않는 이유는 무엇인가? 결과는 무엇인가? GetRolesForUser의 두 번째 버전이 처음에는 작동하지 않습니까? 아니면 둘 다 작동하지 않습니까? – Slauma

+0

아마도 여기에있는 문제와 유사 할 수 있습니다 : http://stackoverflow.com/a/12681527/861716. 호출 당 새로운 'unitOfWork'를 시도하십시오. –

답변

0

저장소 (repository)는 매개 변수로 Expression<Func<T, bool>> 아닌 Func<T, bool>해야 :

public IQueryable<T> Find(Expresssion<Func<T, bool>> expression) 

그런 다음 첫 번째 버전을 사용 ...

public override string[] GetRolesForUser(string username) 
{ 
    string[] listRoles = unitOfWork.RoleRepository 
     .Find(r => r.Utilisateurs.Any(u => u.Login == username)) 
     .Select(r => r.Nom) 
     .ToArray(); 

    return listRoles; 
} 

은 ... 작동합니다.

+0

올바르게 작동합니다. 표현식을 사용하면 – Hichamveo

+0

@ user1081350 : 예, 표현식을 사용하면 Linq 쿼리가 SQL로 변환되어 데이터베이스에서 실행됩니다. – Slauma