Как загружаются предварительно скомпилированные представления Entity Framework

Я обнаружил, что могу повысить производительность своего приложения, предварительно скомпилировав свои представления, используя EdmGen.exe инструмент.

Это все хорошо, но ни я, ни мои коллеги не могут понять, как сгенерированный файл.cs фактически используется проектом. Кажется, нет никаких ссылок на класс, который был сгенерирован где-либо, так как он включается?

Может кто-нибудь пролить свет на это, так как это действительно довольно разочаровывает, не зная, как это работает!


РЕДАКТИРОВАТЬ

Мы убедились, что EntityViewGenerationAttribute используется для маркировки типа класса для предварительно скомпилированного представления, однако это должно означать его загрузку через отражение. Если это так, есть ли способ явно поместить это в коде, что предварительно скомпилированный класс представления должен использоваться для определенного представления?

1 ответ

Вы можете попробовать изменить сгенерированный код. Так что РАЗНОЕ представление было возвращено. Но если вы не вернете представление, я ожидаю, что EF потерпит неудачу.

Идея состоит в том, что сгенерированный класс предназначен для ВСЕХ наборов в DBContext. И действительно, если представление не соответствует имеющемуся у вас контексту (сравнение хэшей), вы получите ошибку времени выполнения.

например

   /// <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;
    }

Но для данного представления вы можете вернуть другую строку

   /// <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");
    }
Другие вопросы по тегам