System.Data.Entity.Database 对象在它认为合适的时候打开和关闭连接。在我使用 ExecuteSqlCommand 的方式中,它将打开和关闭每个命令的连接。因此,临时表将在创建后立即被丢弃。
由于 DbContext 类中存在明显问题,手动打开和关闭 Database.Connection 将不起作用。但是,内部 ObjectContext 对象可以完成这项工作。
这是我为解决方案找到的最佳摘要(非常感谢 Brent McKendrick)
(dbContext as IObjectContextAdapter).ObjectContext.Connection.Open();
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
// perform a list of queries
// The connection will not close!
scope.Complete();
(dbContext as IObjectContextAdapter).ObjectContext.Connection.Close();
}
我将该技术与 SQLiteCommand 结合使用来创建一组临时表和触发器,执行我的操作,使用 LINQ 获取结果,然后结束事务并关闭连接。正如预期的那样,临时对象仅在最后被丢弃。
使用此技术时,我没有检查是否可以使用 Database.ExecuteSqlCommand 代替 SQLiteCommand。
编辑: TransactionScope 不是必需的,并且肯定会增加任何操作的开销。关键部分是通过dbContext的ObjectContext来打开和关闭连接。