每次创建/更新新用户时(执行此操作的方法是将dbcontext对象包装在using语句中),下次引用dbcontext时,会抛出ObjectDisposedException。
我不明白我做错了什么。显然,成员资格提供程序类不会在每次需要时实例化userRepository对象,并且当用户更新时,由于using语句而处理上下文。但我认为这是标准做法?
非常感谢任何帮助。
编辑:
真的没有复杂的代码。设置是:
CustomMembershipProvider会覆盖标准的成员资格提供程序(配置文件已获取详细信息)。 CustomMembershipProvider使用IUserService对象,该对象使用IUserRepository,该对象由具有类级别DBContext私有对象的UserRepository实现。
在UserRepository中,我得到了:
public void UpdateUser(User user)
{
using(_db)
{
... code to indicate that the user state has changed
_db.SaveChanges();
}
}
运行此代码后,请求即告完成。但是当另一个请求用于检索角色信息或从数据库(在UserRepository类中)读取用户时,我会抛出ObjectDisposedException。此时,与用户或角色无关,因为它们使用的是UpdateUser已经处理了_db变量的相同UserRepository类。
我最初让StructureMap解析了DBContext对象,customMembership对象等,但不得不从StructureMap的映射中删除它。
答案 0 :(得分:3)
每次有新用户 创建/更新(执行此操作的方法) 正在包装dbcontext对象 使用声明),下一次 我得到了dbcontext 抛出ObjectDisposedException。
DbContext
是一次性资源(实现IDisposable
)。因此,当您将其封装在using
块中时,当控制流超出using
块时,上下文为disposed。
using(myContext)
{
//do stuff
}
//try to access myContext after the using block throw ObjectDisposedException
您必须重新设计DbContext
的使用方式以及何时处理它。