Я использую 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());
}
}
}
Любые идеи, почему я постоянно УТИЛИЗАЦИИ его, прежде чем он даже был использован?
Избегайте использования 'async void', как описано [здесь] (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx). – Steven
@Steven Да, я сделал это синхронно (интерфейс требует недействительности, и я не хочу его менять), и он работает нормально. Теперь я понимаю, что я понимаю. Можете ли вы поместить этот комментарий в ответ для меня? Еще раз спасибо. – James