我在Simple Injector 3.1.0中注册了以下内容:
container.RegisterForWeb<AppContext>(() => new EFAppContext(
@"DefaultConnection",
new PetaPocoDispatcher(@"DefaultConnection")));
在这个RegisterForWeb方法中,我有:
var hybridLifestyle = Lifestyle.CreateHybrid(
() => HttpContext.Current != null,
new WebRequestLifestyle(),
new LifetimeScopeLifestyle());
container.Register<TService>(instance, hybridLifestyle);
我的EFAppContext
类是IdentityDbContext
public class EFAppContext : IdentityDbContext<ApplicationUser, CustomRole, int,
CustomUserLogin, CustomUserRole, CustomUserClaim>,
AppContext
{
...
}
我按照教程查找EF6 codeproject上的泄漏连接。并扩展了本教程,以便能够查看此泄漏连接正在执行哪个Query。我发现每次我向服务器发出请求时,都会打开一个新连接,但从未关闭。它唯一的查询是:
IF db_id(N'DB_MySystem_TEST') IS NOT NULL
SELECT 1 ELSE SELECT Count(*)
FROM sys.databases
WHERE [name]=N'DB_MySystem_TEST'
这是我的代码或Simple Injector的问题吗?我从未遇到过Simple Injector 2.8.0的这个问题。
答案 0 :(得分:0)
我的EFAppContext
类有一个构造函数,如果数据库存在,每次都会验证:
public class EFAppContext : IdentityDbContext<ApplicationUser, CustomRole, int,
CustomUserLogin, CustomUserRole, CustomUserClaim>,
AppContext
{
if (!this.Database.Exists())
this.Database.CreateIfNotExists();
...
}
而且我不知道为什么它强迫我的连接保持打开状态。所以我用一个交易包裹它:
public class EFAppContext : IdentityDbContext<ApplicationUser, CustomRole, int,
CustomUserLogin, CustomUserRole, CustomUserClaim>,
AppContext
{
using (var dbContextTransaction = this.Database.BeginTransaction())
{
try
{
if (!this.Database.Exists())
this.Database.CreateIfNotExists();
dbContextTransaction.Commit();
}
catch
{
dbContextTransaction.Rollback();
}
}
...
}
现在,我的连接被处理掉了。剩下的唯一问题是为什么......