我有一个关于 MVC 的项目。我们选择 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 对象。” https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
这只是我的经理中的一种方法。但我有十多个。
每次我从管理器调用任何方法时,我都会使用“using
”语句并在内存中创建另一个DBcontext。垃圾收集器(GC)什么时候会处理它们?有人知道吗?
但管理器方法还有其他用途。
我们创建一个全局变量:
private readonly MyEntities db = new MyEntities();
并在每个方法中使用 DBcontext 而不使用“using
”声明。方法如下:
public Item GetItem(long itemId)
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
问题:
- 使用 DBcontext 变量的正确方法是什么?
- 如果我们不使用“
usage
” 声明(因为它影响性能)- GC 会为此做所有事情吗?
我是 EF 使用方面的“菜鸟”,但仍然没有找到这个问题的明确答案。
我想你会发现很多人都建议这种风格的图案。不只是我或亨克DBContext 处理 http://msdn.microsoft.com/en-us/data/jj729737
- 是的,最好对 DBContext 子类型使用语句
- 更好的工作单元模式,通过使用进行管理,具有上下文并处理上下文这只是 UoW 众多示例之一,来自 Tom Dykstra http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
- 每个 Http 请求的工作单元管理器都应该是 New
- 上下文不是线程安全的,因此请确保每个线程都有自己的上下文。
- 让 EF 在幕后缓存内容。
- 测试上下文创建时间。经过几次Http请求后。您还有顾虑吗?
- 如果将上下文存储为静态,预计会出现问题。任何类型的并发访问都会造成损害,如果您使用并行 AJAX 调用,则假设使用静态单一上下文时出现问题的可能性为 90+%。
对于一些性能技巧,非常值得一读 http://msdn.microsoft.com/en-us/data/hh949853
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)