Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于asp.net 4.5的实体框架_Asp.net_Entity Framework 5 - Fatal编程技术网

基于asp.net 4.5的实体框架

基于asp.net 4.5的实体框架,asp.net,entity-framework-5,Asp.net,Entity Framework 5,我的EF使用repository+Untiod工作模式时有一种奇怪的行为 问题是,当我创建一个用户并为其分配一个角色时,重定向到目标页面需要一个特定的角色,因此在我的RoleProvider中,我覆盖GetRolesForUser: public override string[] GetRolesForUser(string username) { string[] listRoles = unitOfWork.RoleRepository.Find(r => r.Utilis

我的EF使用repository+Untiod工作模式时有一种奇怪的行为

问题是,当我创建一个用户并为其分配一个角色时,重定向到目标页面需要一个特定的角色,因此在我的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;
}
对于信息,我对每个请求使用一个工作单元

在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();
    }
}
公共类GenericRepository:IRepository,其中T:class
{
内部环境;
内部IDbSet-dbset;
公共通用存储库(DVE上下文)
{
this.context=上下文;
this.dbset=context.Set();
}
公共工作单位
{
得到;
设置
}
公共IQueryable All()
{
返回dbset.AsQueryable();
}
//公共IQueryable查找(函数表达式)
公共IQueryable查找(函数表达式)
{
返回dbset.Where(表达式).AsQueryable();
}
公共无效添加(T实体)
{
添加(实体);
}
公共无效附加(T实体)
{
附加数据集(实体);
}
公共无效分离(T实体)
{
((IObjectContextAdapter)context.ObjectContext.Detach(实体);
}
公共作废删除(T实体)
{
if(context.Entry(entity.State==EntityState.Detached)
{
附加数据集(实体);
}
删除(实体);
}
公共无效更新(T entityToUpdate)
{
数据库集附加(实体更新);
//dbset.Add(entityToUpdate);
context.Entry(entityToUpdate.State=EntityState.Modified;
}
公共作废保存()
{
SaveChanges();
}
}
谁能给我解释一下这个问题吗


谢谢。

您的存储库应该使用
表达式作为参数,而不是
Func


。。。应该行。

我完全不明白你的问题:(到底什么不起作用?您期望的结果是什么?第二个版本的
GetRolesForUser
是否起作用,但第一个版本不起作用?或者它们都不起作用?可能与这里的问题类似:。每次调用尝试一个新的
unitOfWork
。它工作正常。我理解表达式的使用强制执行数据验证是否在数据库上执行命令?@user1081350:是的,通过使用表达式,Linq查询将被转换为SQL并在数据库中执行。
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();
    }
}
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;
}