我必须一个接一个地重新计算大量实体的值。
在此过程中,所有自跟踪实体都在同一个ObjectContext中被更改。对于需要处理的每个实体,必须从数据库中提取少量数据。这导致了许多相同的SQL查询,但使用了不同的参数。
我正在使用 Solutions Design的ORM Profiler 软件来分析发送到数据库的查询。
查询本身对我来说似乎没问题。它们很短,不需要太多时间来执行。
但是,我对于探查器如何向我显示查询的实际处理方式感到困惑:
正如您所看到的,它会一直打开和关闭相同的数据库连接。
现在,看看单个Open / Query / Close连接的时间:
看起来打开和关闭数据库连接会浪费时间。
阅读this answer后,我更改了代码,现在看起来像这样:
using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
using (var context = new MyEntities(connection))
{
// ...
我现在可以看到它仍在使用相同的连接(这很好),但是,连接仍在关闭并在查询之间打开。
Gert Arnold建议我在使用上下文之前明确打开连接。然后我修改了我的代码,看起来像这样:
using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
connection.Open();
using (var context = new MyEntities(connection))
{
// ...
现在它有效!每个查询都发送到同一个数据库连接:
我现在很好奇为什么我需要在使用上下文之前打开连接?
答案 0 :(得分:4)
可以使用现有连接创建上下文。很难找到有关它的文档,但如果在上下文使用之前显式打开了连接,它将保持打开状态,直到它被明确关闭或处理。我用EF5 ObjectContext
(Linqpad代码)测试了这个:
using (var conn = new EntityConnection(connectionString))
{
conn.Open();
using (var db = new InventoryContext(conn))
{
db.Products.ToList();
conn.State.Dump();
db.SaveChanges();
conn.State.Dump();
}
}
输出为Open
,Open
。未打开连接时,输出为Closed
,Closed
。
答案 1 :(得分:1)
另一种解决方案可能是在构造DbContext
时打开连接:
public partial class QueryModel : DbContext
{
public QueryModel(string connectionName):base(connectionName)
{
this.Database.Connection.Open();
}
}