问题 Entity Framework是否自动缓存ModelBuilder模型?


我正在使用Entity Framework开发ASP MVC应用程序。我正在考虑编写代码来缓存模型构建器返回的对象(正如几个来源所推荐的那样),但后来我在Scott Gu的博客上遇到了这个问题:

“上面的OnModelCreating方法将在我们的NerdDinners类首次在正在运行的应用程序中使用时被调用,并且它作为参数传递一个”ModelBuilder“对象.BodeBuilder对象可用于自定义模型的数据库持久性映射规则我们将在下面看一些如何做到这一点的例子。

“EF仅在正在运行的应用程序中调用”OnModelCreating“方法 - 然后自动缓存ModelBuilder结果。这样可以避免每次实例化NerdDinners类时模型创建的性能损失,并且意味着您不必编写任何自定义缓存逻辑来在应用程序中获得出色的性能。

这是否意味着EF会自动缓存ModelBuilder对象,而且我不必编写代码来执行此操作,或者只有在重写OnModelCreating方法时才会执行此操作,或者......?


6820
2017-08-31 17:20


起源



答案:


来自 实体框架博客 关于EF 4的性能改进

模型缓存

涉及一些成本   发现模型,处理数据   注释和应用流畅的API   组态。为了避免招致这种情况   每次派生的DbContext都会花费   实例化模型被缓存   在第一次初始化期间。该   然后每次重新使用缓存模型   相同的派生上下文是   在同一个AppDomain中构建。   可以关闭模​​型缓存   设置CacheForContextType   ModelBuilder中的属性为'false'   OnModelCreating方法。

因此,Entity Framework 4.0的答案是肯定的


14
2017-08-31 17:29



如果我正确地阅读了这个,那么他说Mode是缓存的而不是CONTEXT,即使在实例化上下文时也会发生缓存。对?缓存DbContext对象没有意义,因为它会在整个会话中发生变化。那,我打算存储在HttpContext.Current对象中。 - Cynthia
我会小心缓存全局缓存中的整个上下文。如果不小心,可能会遇到各种同步问题。你为什么要这样做? - Josh
我没有缓存全局缓存中的上下文。正如我所说,我打算将它缓存在HttpContext.Current对象中。这是我要缓存的模型 - 就像在ModelBuilder模型中=新的模型构建器()。然后你需要使用模型来创建上下文 - model.CreateObjectContext <type>(...)等。对吗? (或CreateDbContext) - Cynthia
我从ADO.NET开发者博客中获取了线索 - blogs.msdn.com/b/adonet/archive/2010/07/14/... - Cynthia
如下面的代码所示:var builder = new ModelBuilder(); builder.Configurations.Add(new BookConfiguration()); builder.Entity <人>(); builder.Entity <Publisher>()。Property(p => p.Name).IsRequired()。HasMaxLength(50); var model = builder.CreateModel(); - Cynthia


答案:


来自 实体框架博客 关于EF 4的性能改进

模型缓存

涉及一些成本   发现模型,处理数据   注释和应用流畅的API   组态。为了避免招致这种情况   每次派生的DbContext都会花费   实例化模型被缓存   在第一次初始化期间。该   然后每次重新使用缓存模型   相同的派生上下文是   在同一个AppDomain中构建。   可以关闭模​​型缓存   设置CacheForContextType   ModelBuilder中的属性为'false'   OnModelCreating方法。

因此,Entity Framework 4.0的答案是肯定的


14
2017-08-31 17:29



如果我正确地阅读了这个,那么他说Mode是缓存的而不是CONTEXT,即使在实例化上下文时也会发生缓存。对?缓存DbContext对象没有意义,因为它会在整个会话中发生变化。那,我打算存储在HttpContext.Current对象中。 - Cynthia
我会小心缓存全局缓存中的整个上下文。如果不小心,可能会遇到各种同步问题。你为什么要这样做? - Josh
我没有缓存全局缓存中的上下文。正如我所说,我打算将它缓存在HttpContext.Current对象中。这是我要缓存的模型 - 就像在ModelBuilder模型中=新的模型构建器()。然后你需要使用模型来创建上下文 - model.CreateObjectContext <type>(...)等。对吗? (或CreateDbContext) - Cynthia
我从ADO.NET开发者博客中获取了线索 - blogs.msdn.com/b/adonet/archive/2010/07/14/... - Cynthia
如下面的代码所示:var builder = new ModelBuilder(); builder.Configurations.Add(new BookConfiguration()); builder.Entity <人>(); builder.Entity <Publisher>()。Property(p => p.Name).IsRequired()。HasMaxLength(50); var model = builder.CreateModel(); - Cynthia