ASP.NET MVC + EF性能

Cof*_*fka 1 c# asp.net-mvc entity-framework dependency-injection ef-code-first

我的控制器中有这个代码:

public class MyController : Controller
{
  private readonly IMyRepository myRepository;

  public MyController() : this(new MyRepository())
  {}

  public MyController(IMyRepository myRepository)
  {
    this.myRepository = myRepository;
  }

  public ActionResult Index()
  {
    return View(myRepository.GetData());
  }
}
Run Code Online (Sandbox Code Playgroud)

MyRepository使用EF进行数据操作.每次用户加载此页面时,MyRepository的实例都在创建.这意味着EF上下文正在创建,Fluent API代码正在执行(OnModelCreating方法).

每次用户加载页面时是否有可能不创建EF上下文?

dan*_*wig 7

MyRepository使用EF进行数据操作.每次用户加载此页面时,MyRepository的实例都在创建.这意味着EF上下文正在创建,Fluent API代码正在执行(OnModelCreating方法).

你错了.在OnModelCreating方法上放置一个断点.当您的应用程序加载时,此方法只会被命中一次.如果重建项目,它将再次点击断点,因为这会导致二进制dll重新加载到app域中.但是,如果您让应用程序继续运行并且两次点击控制器操作(之间没有重建),您将看到OnModelCreating第二次没有命中.就像Serg Rogovtsev所说的那样,EF在OnModelCreating创建模型之后缓存模型(意味着模式).

我对Serg Rogovtsev的回答唯一的反对意见是我永远不会创建DbContext的单例实例.相反,您应该为每个HttpContext使用一个实例(也就是每个Web请求).如果您将它用作单例,并且启用了并发性,您最终会在应用程序中看到DbConcurrencyExceptions.使用DI/IoC,并在请求响应周期的开始/结束时创建/部署DbContext实例.这是最好的做法.不要担心创建new MyDbContext()实例的开销.EF在第一次施工期间初始化(预热)后,未来的结构将相当便宜.