【发布时间】:2014-04-09 11:39:13
【问题描述】:
我使用 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 Container 的一些设置
//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,如here所述。 -
@Steven 是的,我让它同步(接口需要 void,我不想更改它)并且它工作正常。现在我明白了,这很有意义。你能把这个评论变成我的答案吗?再次感谢。
标签: entity-framework asp.net-mvc-5 ioc-container structuremap dbcontext