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上下文?
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在第一次施工期间初始化(预热)后,未来的结构将相当便宜.
归档时间: |
|
查看次数: |
647 次 |
最近记录: |