EF Code-first:如何缓存DbCompiledModel?

时间:2011-03-27 18:37:15

标签: .net entity-framework ef-code-first entity-framework-4.1

我使用Code-First aproach为EF 4.1 RC设置了一个简单的测试项目。我所看到的,每次调用新的MyContext()都需要相当长的时间。 我发现,有一个接受DbCompiledModel的构造函数和描述http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbcompiledmodel(v=VS.103).aspx说,为了更好的性能,缓存这个对象是好的。 但我无法找到如何从现有上下文中获取DbCompiledModel。网上没有样品。

2 个答案:

答案 0 :(得分:9)

模型已经缓存。您可以通过将breakpoing置于OnModelCreating方法来轻松验证它。它只会在您第一次创建上下文时被点击。如果您想手动创建DbCompiledModel,则必须先在上下文之外创建DbModelBuilder。使用其Build方法,然后Compile生成DbModel

答案 1 :(得分:6)

这是我重新思考后发现的。您可以使用以下代码获得已编译模型的副本。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var model = modelBuilder.Build(Database.Connection);
        var compliedModel = model.Compile();
    }

但是,当我将该模型传递给我的上下文并进行一些性能测试时,将它们与对新MyContext()的简单调用进行比较。我发现,由于时间相同,因此上下文已经缓存了已编译的模型。因此,编译模型的缓存似乎只需要手工制作。