我真的为 ADO.net 和 EF v.6 测试了这个东西,并观察了 SQL 表中的连接
select * from sys.dm_exec_connections
要测试的方法如下所示:
1) ADO.net 使用
using(var Connection = new SqlConnection(conString))
{
using (var command = new SqlCommand(queryString, Connection))
{
Connection.Open();
command.ExecuteNonQueryReader();
throw new Exception() // Connections were closed after unit-test had been
//finished. Expected behaviour
}
}
2) ADO.net 不使用
var Connection = new SqlConnection(conString);
using (var command = new SqlCommand(queryString, Connection))
{
Connection.Open();
command.ExecuteNonQueryReader();
throw new Exception() // Connections were NOT closed after unit-test had been finished
finished. I closed them manually via SQL. Expected behaviour
}
1) EF 与使用。
using (var ctx = new TestDBContext())
{
ctx.Items.Add(item);
ctx.SaveChanges();
throw new Exception() // Connections were closed, as expected.
}
2) 不使用 EF
var ctx = new TestDBContext();
ctx.Items.Add(item);
ctx.SaveChanges();
throw new Exception() // Connections WERE successfully closed, as NOT expected.
我不知道为什么会这样,但是 EF 自动关闭了连接。此外,所有使用 EF 的存储库和UnitOfWork模式都不使用 using 语句。这对我来说很奇怪,因为 DBContext 是 Disposable 类型,但这是事实。
问题是为什么会这样:为什么 EF 会在异常后自动释放资源(连接)?也许在 Microsoft 中,他们在处理异常和关闭连接方面比在纯 ADO.net 中做得更好?
为什么所有模式的例子都忽略了使用语句?
添加: >>对于您的最后一个示例,连接在您的第三行代码中打开和关闭
仅当您尝试访问 cxt.Items DbSet 时,才在连接池中创建连接,而不是之前和之后: 通过调用 Save 连接已经存在: 它们也存在并且在离开 Save 之后以及在抛出异常和测试方法之后有已离开: 并在程序停止工作后关闭: