2013-06-03 59 views
3

我有一個類包含幾個常用方法,這些方法是在我的MVC應用程序中使用的,這些方法在幾個地方使用。下面是一些例子:什麼時候需要配置db連接

private MyEntities db = new MyEntities(); 


    public List<SelectListItem> GetLocationList() 
    { 
     var query = 
       db.v_LocationsAlphabetical.OrderByDescending(x => x.Category).ThenBy(x => x.LocationName).ToList() 
       .Select(x => new SelectListItem 
       { 
        Value = x.LocationID.ToString(), 
        Text = x.LocationName 
       }); 

     return (query).ToList(); 
    } 

    public IEnumerable<SelectListItem> GetStates() 
    { 
     var query = db.States.Select(x => new SelectListItem 
     { 
      Value = x.Abbr, 
      Text = x.Name 
     }); 

     return(query); 
    } 

    public List<Person> GetPeople() 
    { 
     var query = db.Person.OrderBy(m => m.LastName).ThenBy(m => m.FirstName).ToList(); 

     return (query); 

    } 

這些方法中的每一個進行調用的數據庫獲取數據,我想知道如果我需要一個dispose添加到每個方法。如果不是,爲什麼?謝謝。

+2

完全不相關,但是有沒有一個原因,你總是返回你的查詢之間parethesis? – NunoCarmo

回答

0

不需要手動配置DbContexts,除非您自己手動管理連接。因此,處置它們通常是可選的。

+3

垃圾收集基於範圍可訪問性自動發生,但處置不會。 http://stackoverflow.com/questions/1691846/does-garbage-collector-call-dispose – recursive

+0

來自EF團隊(編寫DbContext類的人)的迴應解釋了爲什麼在幾乎所有情況下,DbContexts都不需要手動處理:http://blog.jongallant.com/2012/10/do-i-have-to-call-dispose-on-dbcontext.html#.Ua0IS5yXT0U –

+0

感謝您的不正確的倒票,哦。 –

6

您不應該在每種方法中調用dispose,因爲db的生命週期與封閉類的生命週期相同,因爲它不是方法中的局部變量。

處理此問題的典型方法是使當前類IDisposableDispose()方法中調用db.Dispose()

+1

而這通常是不正確的。通常不需要在DbContext上調用Dispose,因爲沒有什麼可處置的。這直接來自編寫DbConext類的EF團隊。要詳細瞭解爲什麼http://blog.jongallant.com/2012/10/do-i-have-to-call-dispose-on-dbcontext.html#.Ua0IS5yXT0U –

+0

@RobertMcKee:這似乎是一個有趣的選擇當不應該處理時將類標記爲「IDisposable」。 – recursive

+0

只有在您自己手動操作連接時才需要。否則將沒有任何處置。由於大多數人不自己手動打開和關閉連接,因此處置是可選的。 –

0

有處理在.NET數據庫連接
我最喜歡的多種方式中的一個叫one dbcontext per request,這基本上意味着你初始化你的DbContext需要的時候,做的工作,而不考慮實例化,處置,並自動配置當請求完成時。 (有點UnitOfWork-ish)

我已經展示了這種方法here。它不僅適用於EF,還適用於Linq2SQL,ADO.NET等。

相關問題