Search code examples
c#entity-framework-coredisposeidisposable

Should I dispose DbContext when using Entity Framework Core


I have the following method in the aspx file (.NET Framework 4.6.2 project):

public static string SetAvgPeriodDays(int userId)
{
    var service = new AveragePeriodDaysService(EfHelper.GetContext());

    try
    {
        return service.SetAveragePeriodDays(userId);
    }
    catch (Exception e)
    {
        return e.Message;
    }
}

AveragePeriodDaysService class has a constructor that accepts DbContext instance:

public class AveragePeriodDaysService
{
    private readonly MyDbContext _ctx;

    public AveragePeriodDaysService(MyDbContext ctx)
    {
        _ctx = ctx;
    }

    public string SetAveragePeriodDays(int userId)
    {
        // main logic goes here...
    }
}

And here EfHelper class:

public class EfHelper
{   
    public static MyDbContext GetContext()
    {
        var options = new DbContextOptionsBuilder<MyDbContext>();

        var connectionString = ...
        options.UseSqlServer(connectionString);
        options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);

        return new MyDbContext(options.Options);
    }
}

Question. Should I dispose MyDbContext? If yes, how should I do it properly?


Solution

  • As a rule you should never dispose dependencies that you got from outside because you never know who else uses same instance of this dependency. It means AveragePeriodDaysService can't dispose MyDbContext. But SetAvgPeriodDays knows exactly who will consume MyDbContext because it requested the creation of MyDbContext, hence it can and should dispose it after usage. Use using keyword:

    public static string SetAvgPeriodDays(int userId)
    {
        using(var ctx = EfHelper.GetContext())
        {
            var service = new AveragePeriodDaysService(ctx);
    
            try
            {
                return service.SetAveragePeriodDays(userId);
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }
    }