我希望每个请求都有一个数据库连接。我试图通过重用我的身份ApplicationDbContext
来实现这一目标。我已在此DbSet
中为我的应用程序实体定义了ApplicationDbContext
。所以这应该是我整个应用程序所需的唯一上下文。
我的ConfigureAuth
方法配置为每ApplicationDbContext
创建一个OwinContext
。
Startup.cs
public void ConfigureAuth(IAppBuilder app)
{
// db context and user manager use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
....
}
在我的API控制器中,我使用OwinContext来检索上下文。
SomeController
private ApplicationDbContext _db;
public ApplicationDbContext DB
{
get
{
if (_db == null)
{
_db = Request.GetOwinContext().Get<ApplicationDbContext>();
_db.Configuration.ProxyCreationEnabled = false;
}
return _db;
}
private set
{
_db = value;
}
}
到目前为止一切顺利。为了监控此行为,我在Dispose
类中实现了ApplicationDbContext
方法。
ApplicationDbContext.cs
protected override void Dispose(bool disposing)
{
Debug.WriteLine("Disposing ApplicationDbContext");
base.Dispose(disposing);
}
现在我从未见过那些处理消息的人。这是否意味着我有过时的数据库连接?您可能已经注意到我禁用了AutomaticProxy创建。这会影响生命周期吗?这是身份问题吗?
我自己推理我在控制器中不需要dispose
方法来处理上下文,因为这是owin部分将为我做的。