EF でリポジトリ + unti od 作業パターンを使用すると、奇妙な動作が発生します。
問題は、ユーザーを作成してロールを割り当てると、宛先ページへのリダイレクトには特定のロールが必要になるため、 RoleProvider で GetRolesForUser をオーバーライドすることです。
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();
そして私のDAIでは、汎用リポジトリを使用しています:
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();
}
}
誰か私に問題を説明してもらえますか?
ありがとう。