Pro*_*ofK 1 asp.net-mvc entity-framework roleprovider ef-code-first asp.net-mvc-4
我的角色提供者看起来像下面的类(删节).我在VS 2012上运行IIS Express和SQL 2012 Express,我在这个角色提供程序代码中得到了许多看似随机的异常.
public class Educ8RoleProvider : RoleProvider
{
private readonly Educ8DbContext _dbContext = new Educ8DbContext();
private readonly Authorization _authorization;
public Educ8RoleProvider()
{
_authorization = new Authorization(_dbContext);
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
try
{
base.Initialize(name, config);
}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(ex);
throw;
}
}
public override bool IsUserInRole(string username, string roleName)
{
return GetRolesForUser(username).Any(r => r.ToLower() == roleName);
}
public override string[] GetRolesForUser(string username)
{
return _authorization.GetRolesForMember(username).Select(r => r.Name).ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我Authorization
班级的一个例子:
public class Authorization
{
private readonly Educ8DbContext _dbContext;
private readonly IMemberRepository _memberRepository;
private readonly IRoleRepository _roleRepository;
private readonly IMemberRoleRepository _memberRoleRepository;
public Authorization(Educ8DbContext context)
{
_dbContext = context;
_memberRepository = new MemberRepository(_dbContext);
_roleRepository = new RoleRepository(_dbContext);
_memberRoleRepository = new MemberRoleRepository(_dbContext);
}
public IQueryable<Role> GetRoles()
{
return _roleRepository.ListAll();
}
public IQueryable<Role> GetRolesForMember(int memberId)
{
var roleIds = _memberRoleRepository.ListAll()
.Where(mr => mr.MemberId == memberId)
.Select(mr => mr.RoleId);
return _roleRepository.ListAll()
.Where(r => roleIds.Contains(r.Id));
}
}
Run Code Online (Sandbox Code Playgroud)
我每小时得到大约两到三个以下异常.重新启动项目会立即解决问题,直到下一个问题.
值得注意的是,我在项目的其他任何地方都存在绝对零数据访问问题.
关于可能导致这种情况的任何建议都会受到欢迎.
Gert Arnold的评论是正确的.你必须意识到RoleProvider
作为单身人士的奔跑.每次重新启动应用程序时,都会导致构建此类的新实例.只要您的应用程序正在运行,它就会继续使用这个单一实例.
在我意识到这个类以单例形式运行之前,我曾经遇到过与你问题相同的异常.掌握了这些知识之后,让这些例外消失并不困难:
public class Educ8RoleProvider : RoleProvider
{
//private readonly Educ8DbContext _dbContext = new Educ8DbContext();
//private readonly Authorization _authorization;
public Educ8RoleProvider()
{
//_authorization = new Authorization(_dbContext);
}
private Authorization GetAuthorization()
{
return new Authorization(new Educ8DbContext());
}
public override void Initialize(string name, NameValueCollection config)
{
try
{
base.Initialize(name, config);
}
catch (Exception ex)
{
ErrorSignal.FromCurrentContext().Raise(ex);
throw;
}
}
public override bool IsUserInRole(string username, string roleName)
{
return GetRolesForUser(username)
.Any(r => r.ToLower() == roleName);
}
public override string[] GetRolesForUser(string username)
{
return GetAuthorization().GetRolesForMember(username)
.Select(r => r.Name).ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
从本质上讲,您希望确保每个方法调用RoleProvider
一个全新的DbContext
实例.这样,RoleProvider
单身人士就不会挂在一个DbContext
陈旧的单身上.
归档时间: |
|
查看次数: |
413 次 |
最近记录: |