基于asp.net 4.5的实体框架
我的EF使用repository+Untiod工作模式时有一种奇怪的行为 问题是,当我创建一个用户并为其分配一个角色时,重定向到目标页面需要一个特定的角色,因此在我的RoleProvider中,我覆盖GetRolesForUser:基于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
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;
}