DbContext是使用StructureMap的Disposed Exception

时间:2014-04-09 11:39:13

标签: entity-framework asp.net-mvc-5 ioc-container structuremap dbcontext

我使用StructureMap作为我的IOC容器。我创建了一个在启动时运行的种子方法,以确保数据库具有相关数据。当它运行时,我得到错误

  

由于已经处理了DbContext,因此无法完成操作。

有问题的种子类是

public class SeedDatabase : IRunAtStartup
{
    private DbContext _context;
    private UserManager<ApplicationUser> _userManager;
    public SeedDatabase(DbContext context, UserManager<ApplicationUser> userManager)
    {
        _context = context;
        _userManager = userManager;
    }

    public async void Execute()
    {
        if (!_context.Set<ApplicationUser>().Any())
        {
            //Seed Admin User
            await _userManager.CreateAsync(new ApplicationUser
                  {
                     UserName = "Admin",
                     Company = "Test Company Ltd",
                     EmailAddress = "email@emailaddress.com"
                  }, _userManager.PasswordHasher.HashPassword("Password"));

           _context.SaveChanges();
        }
    }
}

点击.SaveChanges()

时发生错误

此方法在启动时只运行一次,并在其结构中接受UserManagerDbContext,它们是通过IOC容器提供的。

我尝试过每个HttpRequest处理DbContext,这是我的偏好,但也作为单身人士。但情况并没有改变。

以下是IOC容器的一些设置

//convention for DbContext
public class DbContextConvention : IRegistrationConvention
{
     public void Process(Type type, Registry registry)
     {
         //be sure a new context is used for each request
         if (type.CanBeCastTo(typeof(DbContext)) && !type.IsAbstract)
         {
            registry.For(type).LifecycleIs(new UniquePerRequestLifecycle());
         }
     }
}

为什么我在使用它之前一直处理它的任何想法?

1 个答案:

答案 0 :(得分:3)

问题可能是由Execute方法的异步性质引起的。此方法几乎立即返回,并将在后台线程上继续。你可能在Execute返回后处理DbContext,但是在那个时刻后台操作还没有完成。相反,返回Task并在清理之前等待该任务完成,或使Execute方法同步。