EF(实体框架)使用“;使用“;陈述
本文关键字:使用 陈述 实体 框架 EF | 更新日期: 2023-09-27 18:25:39
我有一个关于MVC的项目。我们为DB交易选择了EF。我们为BLL层创建了一些管理器。我发现了很多例子,其中使用了"using
"语句,即
public Item GetItem(long itemId)
{
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
}
在这里,我们创建一个DBcontext MyEntities()
的新实例。我们使用"using
"是为了"确保IDisposable对象的正确使用"
这只是我经理的一种方法。但我有十多个。每次从管理器调用任何方法时,我都会使用"using
"语句,并在内存中创建另一个DBcontext。垃圾收集器(GC)什么时候处理它们?有人知道吗?
但管理器方法还有其他用法。我们创建了一个全局变量:
private readonly MyEntities db = new MyEntities();
并且在没有"using
"语句的每个方法中使用DBcontext。方法如下:
public Item GetItem(long itemId)
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
问题:
- 使用DBcontext变量的正确方法是什么
- 如果我们不使用"
usage
"语句(因为它会影响性能),GC会为此做所有的事情,会怎么样
我是EF使用方面的"新手",仍然没有找到这个问题的明确答案。
我想你会发现很多人建议使用这种模式。不仅仅是我或HenkDBContext处理
- 是,理想情况下对DBContext子类型使用语句
- 使用Using管理的更好的工作单元模式,有上下文并处理上下文只是许多UoW示例中的一个,这一个来自Tom Dykstra
- 每个Http请求的工作单元管理器都应该是新的
- 上下文不是线程安全的,所以请确保每个线程都有自己的上下文
- 让EF缓存幕后的东西
- 测试上下文创建时间。在几个Http请求之后。你还有顾虑吗
- 如果将上下文存储在静态中,则会出现问题。任何类型的并发访问都会造成伤害,如果您使用并行AJAX调用,假设使用静态单个上下文时出现问题的可能性为90%以上
对于一些性能提示,值得一读
使用DBContext变量的正确或最佳做法是使用using。
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
好处是很多事情都是自动为我们完成的。例如,一旦代码块完成,就会调用dispose。
根据MSDN EF使用DbContext
上下文的生存期从创建实例时开始,并且当实例被释放或垃圾回收时结束。使用如果希望上下文控制的所有资源都是设置在块的末端。使用时,编译器自动创建try/finaly块,并在最后阻止。