2

Я использую StructureMap в качестве контейнера IOC. Я создал метод семени, который запускается при запуске, чтобы убедиться, что в базе данных есть соответствующие данные. Когда это выполняется, я получаю сообщение об ошибкеDbContext Disposed Exception using StructureMap

Операция не может быть выполнена, так как был удален 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 protected]" 
        }, _userManager.PasswordHasher.HashPassword("Password")); 

      _context.SaveChanges(); 
     } 
    } 
} 

ошибка происходит на удар .SaveChanges()

Этот метод просто запускается один раз при запуске, и он принимает UserManager и DbContext в его conctructor, которые предусмотрены средства контейнера МОК.

Я пытался обработать DbContext на HttpRequest, который был моим предпочтением, но также и как синглтон. Однако ситуация не изменилась.

Вот некоторые из установки для МОК контейнер

//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()); 
     } 
    } 
} 

Любые идеи, почему я постоянно УТИЛИЗАЦИИ его, прежде чем он даже был использован?

+0

Избегайте использования 'async void', как описано [здесь] (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx). – Steven

+0

@Steven Да, я сделал это синхронно (интерфейс требует недействительности, и я не хочу его менять), и он работает нормально. Теперь я понимаю, что я понимаю. Можете ли вы поместить этот комментарий в ответ для меня? Еще раз спасибо. – James

ответ

3

Проблема, вероятно, связана с асинхронным характером вашего метода Execute. Этот метод вернется почти сразу и продолжит фоновый поток. Вероятно, вы удаляете DbContext после возврата Execute, но в этот момент фоновая операция еще не закончена. Вместо этого верните Task и дождитесь завершения этой задачи перед очисткой или сделайте метод Execute синхронным.

Смежные вопросы