2013-08-19 93 views
1

是否有可能使用的DbContext时像EF 5连接管理

public void UpdateCategory(Models.Category catData) 
    { 
     if (catData == null) return; 
     using (var cntx = new DataContext()) 
     { 
      //IN THE LINE BELOW A CONNECTION IS DEFINITELY OPENED BUT IS IT IMMEDIATELY CLOSE???? 
      var cat = cntx.Set<Category>().FirstOrDefault(c => c.CategoryId == catData.CategoryId); 

      if (cat == null) return; 

      if (!cat.LastChanged.Matches(catData.LastChanged)) 
       throw new ConcurrencyException(cat.GetType().ToString()); 

      cat.CategoryName = catData.CategoryName; 

      cntx.DbContext.Entry<Category>(cat).State = System.Data.EntityState.Modified; 

      //AFTER THE NEXT LINE DO I HAVE 2 CONNECTIONS OPENED? OR WAS THE CONNECTION OPENED FROM THE FIRST QUERY CLOSED ALREADY? 
      cntx.SaveChanges(); 


      catData.LastChanged = cat.LastChanged; 
     } 

    } 

是否有EF5不会立即关闭连接scenerios \其中相同的情况下创建\错误打开2个连接,留下一个开放?

+3

你怎么知道你有2个连接打开?活动监视器?我不会太担心EFs连接管理,我敢肯定它是稳定的...... – Charleh

+0

如果底层连接是SQL,那么默认情况下会发生很多事情,而这些都不知道:连接池等。正如Charleh所说,我不会太担心 - 标准生成的上下文在处理连接方面做得很好。 – wilso132

回答

1

如果你看看这里的MSDN:http://msdn.microsoft.com/library/vstudio/bb896325

实体框架打开连接,只有在需要时,例如执行查询或打电话的SaveChanges,然后在操作完成后关闭连接。

当一个查询方法被调用时,连接被打开,并且它一直保持打开状态,直到ObjectResult已被完全消耗或处置。

public void UpdateCategory(Models.Category catData) 
{ 
    if (catData == null) return; 
    using (var cntx = new DataContext()) 
    { 
     //IN THE LINE BELOW A CONNECTION IS DEFINITELY OPENED BUT IS IT 
     //IMMEDIATELY CLOSE? => YES! 
     var cat = cntx.Set<Category>() 
          .FirstOrDefault(c => c.CategoryId == catData.CategoryId); 

     if (cat == null) return; 

     if (!cat.LastChanged.Matches(catData.LastChanged)) 
      throw new ConcurrencyException(cat.GetType().ToString()); 

     cat.CategoryName = catData.CategoryName; 

     cntx.DbContext.Entry<Category>(cat).State = System.Data.EntityState.Modified; 

     //AFTER THE NEXT LINE DO I HAVE 2 CONNECTIONS OPENED? => NO 
     cntx.SaveChanges(); 


     catData.LastChanged = cat.LastChanged; 
    } 

} 

是否有scenerios在同样的情况下创建\打开2个连接,留下一个开放?

是,使用事务时使用的DbContext它会打开第二个连接看看这里:http://www.digitallycreated.net/Blog/48/entity-framework-transactionscope-and-msdtc