EF(实体框架)“using”语句的用法

2024-04-04

我有一个关于 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();
}

问题:

  1. 使用 DBcontext 变量的正确方法是什么?
  2. 如果我们不使用“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(使用前将#替换为@)

EF(实体框架)“using”语句的用法 的相关文章

随机推荐