How do Entity Framework pre-compiled views get loa

2019-06-24 05:02发布

I've discovered I can increase performance of my application by pre-compiling my views using the EdmGen.exe tool.

This is all well and good, but neither me or my colleges can work out how the generated .cs file is actually used by the project. There doesnt seem to be any references to the class that was generated anywhere, so how is it getting included?

Can anyone shed any light on this as its really rather frustrating not knowing how it works!


EDIT

We've acertained that the EntityViewGenerationAttribute is used to mark the class type for the pre-compiled view, however this must mean its loaded though reflection. If thats the case, is there any way of explicitly putting it in code that a pre-compiled view class should be used for a certain view?

1条回答
对你真心纯属浪费
2楼-- · 2019-06-24 05:42

You could try changing the generated code. So that a DIFFERENT view was returned. But if you dont return a view I expect that EF will fail.

The idea is that the generated class is for ALL sets in a DBContext. And indeed if the view doesnt match the context you have (hash comparison) you will get a runtime error.

eg

   /// <Summary>
    /// The constructor stores the views for the extents and also the hash values generated based on the metadata and mapping closure and views.
    /// </Summary>
    public ViewsForBaseEntitySets24F9763E92A9F77E970A08557E1855C7579989F684539A5FB429069F966B9B7B()
    {
        this.EdmEntityContainerName = "Ef6Ctx3";
        this.StoreEntityContainerName = "CodeFirstDatabase";
        this.HashOverMappingClosure = "d7686982aa7cffcf874313838914e93f78d4d7d6d345d19261ef5edc8b4e96dd";
        this.HashOverAllExtentViews = "7b8857ee3ee44d13b2479e43c54dbdfb6bc8914e222c7891afcfcd9a29b06b2f";
        this.ViewCount = 2;
    }

But for a given view, you could return a different string

   /// <Summary>
    /// return view for CodeFirstDatabase.pocotest
    /// </Summary>
    private System.Collections.Generic.KeyValuePair<string, string> GetView0()
    {
        return new System.Collections.Generic.KeyValuePair<string, string>("CodeFirstDatabase.pocotest", @"
SELECT VALUE -- Constructing pocotest
    [CodeFirstDatabaseSchema.pocotest](T1.pocotest_Id, T1.pocotest_f1, T1.pocotest_f2, T1.pocotest_f2a, T1.pocotest_f3, T1.pocotest_f5, T1.pocotest_f6b)
FROM (
    SELECT 
        T.Id AS pocotest_Id, 
        T.f1 AS pocotest_f1, 
        T.f2 AS pocotest_f2, 
        T.f2a AS pocotest_f2a, 
        T.f3 AS pocotest_f3, 
        T.f5 AS pocotest_f5, 
        T.f6b AS pocotest_f6b, 
        True AS _from0
    FROM Ef6Ctx3.poco1s AS T
) AS T1");
    }
查看更多
登录 后发表回答