首页 > 解决方案 > 使用 Entity Framework Core 时我应该处置 DbContext

问题描述

aspx我在文件(.NET Framework 4.6.2 项目)中有以下方法:

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

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

AveragePeriodDaysService类有一个接受DbContext实例的构造函数:

public class AveragePeriodDaysService
{
    private readonly MyDbContext _ctx;

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

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

在这里EfHelper上课:

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);
    }
}

问题。我应该处置 MyDbContext 吗?如果是,我应该如何正确执行?

标签: c#entity-framework-coredisposeidisposable

解决方案


通常,您永远不应该处理从外部获得的依赖项,因为您永远不知道还有谁使用此依赖项的相同实例。这意味着AveragePeriodDaysService不能处置MyDbContext。但是SetAvgPeriodDays确切地知道谁会消费MyDbContext,因为它要求创建MyDbContext,因此它可以并且应该在使用后处理它。使用using关键字:

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;
        }
    }
}

推荐阅读