我试图找到使用实体框架和DbContext从Tracing and Caching Provider Wrappers for Entity Framework使用EFCachingProvider的方法。我使用EF 4.x DbContext Generator为c#生成模型类。 我已经添加了对EFProviderWrapperToolkit,EFCachingProvider,EFTracingProvider的引用。我还将我的web.config文件更改为:
<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>
但是当应用程序启动时,它会在EFProviderWrapperToolkit的DbConnectionWrapper中抛出一个错误 在线:
DbProviderFactory factory = DbProviderFactories.GetFactory(providerInvariantName);
这是继承自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; }
}
我已经阅读了帖子:USING TRACING AND CACHING PROVIDER WRAPPERS WITH CODEFIRST,但它没有解决我的问题。
有谁知道怎么做?
答案 0 :(得分:3)
我们已将EFCachingProvider与Entity Framework和Code First一起使用。您可以在MVCForum on CodePlex的源代码中看到我们的实现。
我们发现有许多示例显示了跟踪提供程序,但没有任何示例显示缓存提供程序使用Code First。
它不仅适用于开箱即用的代码。我们使用DbContext
和TransactionScope
时出现问题。为了进行在EFCachingProvider
包装器中重写的调用,从而重定向到缓存,我们需要使用来自连接的事务,而不是TransactionScope
。我们无法从DbContext
获取连接,因为它处理连接本身,因此我们使用了基础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类中看到完整的实现。