1

I have trying to find the way to use EFCachingProvider from Tracing and Caching Provider Wrappers for Entity Framework with Entity Framework and DbContext. I use EF 4.x DbContext Generator for c# to generate model classes. I've already added references to EFProviderWrapperToolkit, EFCachingProvider, EFTracingProvider. I also made changes in my web.config file to :

  <connectionStrings>
    <add name="MyEntities" connectionString="Server=myServer;Database=MyDB;User ID=User;Password=pass;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" providerName="EFTracingProvider" />
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <add name="EF Caching Data Provider" invariant="EFCachingProvider" description="Caching Provider Wrapper" type="EFCachingProvider.EFCachingProviderFactory, EFCachingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
      <add name="EF Tracing Data Provider" invariant="EFTracingProvider" description="Tracing Provider Wrapper" type="EFTracingProvider.EFTracingProviderFactory, EFTracingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
      <add name="EF Generic Provider Wrapper" invariant="EFProviderWrapper" description="Generic Provider Wrapper" type="EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b" />
    </DbProviderFactories>
  </system.data>

But when app start, it throws an error in DbConnectionWrapper from EFProviderWrapperToolkit in line:

DbProviderFactory factory = DbProviderFactories.GetFactory(providerInvariantName);

This is class which inherits from DbContext:

public class MyEntities : DbContext
{
    public MyEntities()
        : base("MyEntities")
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
        modelBuilder.Entity<Product>().ToTable("Product");
        modelBuilder.Entity<ProductPhoto>().ToTable("ProductPhoto");


        base.OnModelCreating(modelBuilder);
    }

    public DbSet<Product> Product { get; set; }
    public DbSet<ProductPhoto> ProductPhoto { get; set; }
}

I've already read post: USING TRACING AND CACHING PROVIDER WRAPPERS WITH CODEFIRST, but it didn't solve my problem.

Does anyone know how to do it ?

4

1 に答える 1

3

Entity Framework と Code First で EFCachingProvider を使用しました。CodePlex の MVCForumのソース コードで実装を確認できます。

トレーシング プロバイダーを示す例は多数ありますが、Code First を使用したキャッシュ プロバイダーを示す例はありません。

すぐに使用できるコードだけでは機能しませんでした。と の使用に問題がDbContextありTransactionScopeました。ラッパーでオーバーライドされ、EFCachingProviderそれによってキャッシュにリダイレクトされた呼び出しを行うには、 ではなく、接続からのトランザクションを使用する必要がありましたTransactionScopeDbContext接続自体を処理するため、から接続にアクセスできませんでした。そのため、基になる を使用しましたObjectContext

        private readonly IDbTransaction _transaction;

        _objectContext = ((IObjectContextAdapter) _context).ObjectContext;
        if (_objectContext.Connection.State != ConnectionState.Open)
        {
            _objectContext.Connection.Open();
            _transaction = _objectContext.Connection.BeginTransaction();
        }

その後、キャッシング プロバイダーは呼び出しを適切にインターセプトします。など_transactionを発行するオブジェクトを使用します。Commit()Rollback

UnitOfWork クラスで完全な実装を見ることができます。

于 2012-08-09T08:48:31.023 に答える