0

VS2012 で EF PowerTools (EF5) を使用して、大規模なコード ファーストの DataContext 用にコンパイル済みのビューを生成しました。残念ながら、これはデータ コンテキストへの最初の呼び出しを高速化するのに役立ちませんでした。それでも約13秒かかります。私が考慮していない、コンパイル済みのビューを使用するための考慮事項はありますか? 移行を使用しておらず、データベースの初期化を無効にしています。

<connectionStrings>
    <add name="MyDataContext" connectionString="..." providerName="System.Data.SqlClient" />
</connectionStrings>

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <contexts>
        <context type="MyNameSpace.MyDataContext, MyNameSpaceAssembly" disableDatabaseInitialization="true" />
    </contexts>
</entityFramework>
4

2 に答える 2

0

さまざまな検索用語でインターネットを掘り下げた後、これを理解することができました。エンティティがデータ コンテキストと同じアセンブリにない場合、プリコンパイル済みビューを使用すると問題が発生します。この問題は次の場所で説明されています。

コンテキストがドメイン クラスとは別のプロジェクトにある場合、エンティティ フレームワーク コードのコンパイル済みビューを最初に配置する必要があるアセンブリ

回避策はありますが、かなりハックだと思います。コンテキストで定義された最初の DbSet エンティティは、DataContext と同じアセンブリに存在する必要があります。コンテキストのアセンブリでこの任意のエンティティ クラスを作成しました。

public class PreCompiledView
{
    public int PreCompiledViewId { get; set; }
}

そして私のコンテキストにDbSetを追加しました:

public class MyDataContext : DbContext
{
    #region DBSets

    // HACK: Enable pre-compiled views
    internal DbSet<PreCompiledView> PreCompiledViews { get; set; }

    // My entity sets
    public DbSet<MyOtherAssemblyEntity> MyOtherAssemblyEntities { get; set; }
    ...

    #endregion
}

事前にコンパイルされたビューが反映され、datacontext によって使用されるようになりました。カスタム データベース初期化子の Seed() オーバーライドでは、SQL DROP ステートメントを実行して dbo.PrecompiledViews テーブルを削除し、開発者から隠しておきます。

context.Database.ExecuteSqlCommand("DROP TABLE [dbo].[PreCompiledViews]");
于 2014-11-24T23:23:04.270 に答える