2013-06-03 3 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 такое же, как у охватывающего класса, так как это не локальная переменная в методе.

Типичным способом обработки этого является создание текущего класса IDisposable и вызов db.Dispose() в методе Dispose().

+1

И это было бы неправильно. Вызов Dispose в DbContext обычно не требуется, поскольку ничего не нужно распоряжаться. Это происходит непосредственно от команды EF, которая написала класс DbConext. Для полного объяснения того, почему 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 при необходимости, сделать работу, не думая о инстанцировании или утилизации, и распоряжаться автоматически когда запрос будет выполнен. (kinda UnitOfWork-ish)

Я уже показал этот подход here. Он применим не только к EF, но и к Linq2SQL, ADO.NET и т. Д.

Смежные вопросы