-1

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();
    }
}

誰か私に問題を説明してもらえますか?

ありがとう。

4

1 に答える 1

0

リポジトリは:Expression<Func<T, bool>>ではなく as パラメータを取る必要があります。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;
}

...動作するはずです。

于 2013-04-15T00:40:58.927 に答える