2011-05-26 26 views
2

我正在使用L2S检查密钥是否已存在,如果不存在,请创建并插入一个密钥。同样的DataContext也用于在同一个C#方法中执行其他查询。在完成它之后,我正在使用using关键字来处理DataContext。我迷上了sql分析器,看到它会登录,执行查询,然后注销。即使相同的DataContext稍后会执行查询或更新,它似乎也会这样做。我认为datacontext只登录一次,并在该会话期间执行所有查询?你多久打电话给SubmitChanges()很重要?或者我错过了什么?Linq2Sql datacontext登录/注销行为

嘲笑我所看到的:

using(Datacontext) 
{ 
     //Audit Login 
     var b = DataContext.Table.FirstOrDefault(t=>t.Id == 4); 
     //RPC: Completed 
     //Audit Logout 

     //Audit Login 
     var x = DataContext.OtherTable.Any(t=>t.Id == 4); 
     //RPC: Completed 
     //Audit Logout 

} 

更新

SQL事件探查器中显示为几百毫秒这些注销的“持续时间”。那段时间我的应用程序正在等待?

+1

你也可能要更改FirstOrDefault这里的SingleOrDefault(假设你ID是唯一的......你总是会得到一个结果)。这将从您的SQL问题中删除“Top 1”。也许你再次获得一些毫秒 – Pleun 2011-05-26 15:18:43

回答

1

FirstOrDefault执行一个查询,因为它需要给你一个结果回来,而不是一个潜在的集合 - Any也是如此。当你创建一个DataContext时,它不会马上登录。我可以向你保证,虽然这可能看起来“不好”,但它完全没问题。

+0

但sql分析器显示这些注销的“持续时间”为几百毫秒。那段时间我的应用程序正在等待? – 2011-05-26 15:14:02

1

在Linq-2-sql中任何()和.FirstOrDefault()调用你在这里使用它们的方式都不会被延迟。当你给他们打电话时,他们会导致执行发生。所以在这种情况下,它们会立即启动,这也是您在剖析器中注意到的。

参见:How to maintain LINQ deferred execution?

我认为你是对另一方面有点混合查询,一方面和更新的延迟执行。

每次调用Submitchanges时,都会提交等待发生的所有更改。通常你只需要做一次这样的事情,所有的改变都是在一次事务中完成的。

1

L2S datacontext不保留连接,这就是您在profiler中看到Login/Logout的原因。它确实会持续状态,这对变化跟踪很重要。

下面是L2S的DataContext管理的好文章:http://www.west-wind.com/weblog/posts/2008/Feb/05/Linq-to-SQL-DataContext-Lifetime-Management

+0

如果它不保留连接,那么它在事务范围中的表现如何?底层代码似乎阻止在完成时关闭连接(如果存在事务范围);然而,我注意到在进入事务范围10到15分钟并在该范围内反复调用SubmitChanges ......最终会出现一个突然的,看似随机的“Audit Logout”,并且连接关闭,导致交易失败。交易超时时间为6小时,但这在10至15分钟内失败,原因不明。 – Triynko 2011-11-21 21:47:34