每次更新“用户”(成员)对象时抛出ObjectDisposedException

时间:2011-07-10 22:11:01

标签: entity-framework structuremap membership-provider objectdisposedexception

  • 我正在使用asp.net mvc 3,带有IoC结构图的实体框架。
  • 我有自己的自定义会员提供商。
  • 当我使用StructureMap注入dbcontext对象和成员资格实例时,我遇到了同样的问题,因此我的UserRepository删除了这个问题。
  • UserRepository现在有一个DBContext属性,它在构造函数中初始化。

每次创建/更新新用户时(执行此操作的方法是将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的映射中删除它。

1 个答案:

答案 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的使用方式以及何时处理它。