c# - 使用 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 吗?如果是,我应该如何正确执行?
解决方案
通常,您永远不应该处理从外部获得的依赖项,因为您永远不知道还有谁使用此依赖项的相同实例。这意味着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# - 是否有任何声明性方式来检查 C# REST 服务控制器中输入参数的有效性?
- osgi - 使用 JJWT 版本 0.11.1 在 Karaf (OSGi) 中运行无法加载类 io.jasonwebtoken.impl.crypto.MacProvider
- python - Wtforms.fields.html5 DateField 和 TimeField 占位符
- html - css 伪选择器:不适用于没有 div 作为子级的 div
- python - subprocess.run 不抑制所有控制台输出
- c# - 根据不同类型的另一个列表中的项目查找一个列表中的项目
- wpf - 绑定不适用于 UserControl 中的自定义 DependencyProperty
- sql - 用于标记表中此特定条件至少出现一次或多次的行的 Sql 语法
- reactjs - 没有构建的钩子
- python - 蟒蛇 | 同时写入多个文件