我使用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()
此方法在启动时只运行一次,并在其结构中接受UserManager
和DbContext
,它们是通过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());
}
}
}
为什么我在使用它之前一直处理它的任何想法?
答案 0 :(得分:3)
问题可能是由Execute方法的异步性质引起的。此方法几乎立即返回,并将在后台线程上继续。你可能在Execute返回后处理DbContext
,但是在那个时刻后台操作还没有完成。相反,返回Task
并在清理之前等待该任务完成,或使Execute
方法同步。