c# - 使用 Entity Framework Core 时是否应该处理 DbContext

标签 c# entity-framework-core dispose idisposable

我在 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 吗?如果是,我应该如何正确操作?

最佳答案

作为一条规则,你永远不应该处理你从外部获得的依赖,因为你永远不知道还有谁在使用这个依赖的相同实例。这意味着 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;
        }
    }
}

关于c# - 使用 Entity Framework Core 时是否应该处理 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57802133/

相关文章:

c# - 使用 C#/.NET 替换文件中文本的最佳方法是什么?

c# - ASP.NET 脚本 "scheduling"问题

c# - EF Core 5 - 内存中对象列表过滤不适用于 DBset

在内存数据库中使用 Entity Framework 7 测试 ASP.NET 5

c# - GarbageCollector、Dispose 还是静态方法?

c# - 异常比返回值贵多少?

c# - 不支持 UWP NavigationView

c# - Entity Framework 核心 : How to add a composite object?

c# - 如何使我的 C# Windows 应用程序轻量级?

c# - 为什么 IsDisposed 在调用 Dispose() 后返回 false?