C# Linq-to-Sql – Should DataContext be disposed using IDisposable

Unlike most types which implement
IDisposable, DataContext doesn’t
really need disposing – at least not
in most cases. I asked Matt Warren
about this design decision, and here
was his response:

There are a few reasons we implemented
IDisposable:

  • If application logic needs to hold onto an entity beyond when the
    DataContext is expected to be used or
    valid you can enforce that contract by
    calling Dispose. Deferred loaders in
    that entity will still be referencing
    the DataContext and will try to use it
    if any code attempts to navigate the
    deferred properties. These attempts
    will fail. Dispose also forces the
    DataContext to dump its cache of
    materialized entities so that a single
    cached entity will not accidentally
    keep alive all entities materialized
    through that DataContext, which would
    otherwise cause what appears to be a
    memory leak.
  • The logic that automatically closes the DataContext connection can be
    tricked into leaving the connection
    open. The DataContext relies on the
    application code enumerating all
    results of a query since getting to
    the end of a resultset triggers the
    connection to close. If the
    application uses IEnumerable’s
    MoveNext method instead of a foreach
    statement in C# or VB, you can exit
    the enumeration prematurely. If your
    application experiences problems with
    connections not closing and you
    suspect the automatic closing behavior
    is not working you can use the Dispose
    pattern as a work around.

from the source

Leave a Comment