Entity Framework 4 CodeFirst EFProviderWrapperToolKit 使用


EF 團隊 推出了一套比較完整的緩存和 SQL 執行日志的解決方案, EFProviderWrappers 。他們的做法是在原來的EF Provider之上,再加一層包裝,通過這層包裝攔截,進行 數據 緩存和日志監控。數據緩存功能與NHibernate的二級緩存相比,優勢在於簡單輕量。

最近在做的一個項目采用了EntityFramework4.3 Code First 模式開發,希望引入這個組件完成日志跟蹤和緩存功能。

在網上搜尋EFProviderWrappers 相關資料基本上都是基於ObjectContext而不是DbContext。而且這個組件也沒有更新,最新版本也是2011年4月。

有什么方法才能在EF4上正常使用呢?

現將研究的方法總結一下

  1.  首先是下載這套組件EFProviderWrapperToolKit
  2. 在項目中引用EFProviderWrapperToolkit.dll、EFTracingProvider.dll和  EFCachingProvider.dll 
  3. 在Web.Config 或App.Config配置文件中增加配置節

 

<connectionStrings>                                            

     <add name="TestContext"          

             providerName="System.Data.SqlClient"          

             connectionString="Server=Wyd\Instance;Initial Catalog=DatabaseName;User ID=sa;Password=123;MultipleActiveResultSets=True"/>

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

4.在DbContext類中 建立兩個構造方法(這就是關鍵處了)

 

 1  public  class TestContext : DbContext
 2 {
 3     public TestContext() 
 4    { 
 5    }   
 6     public TestContext(DbConnection conn)
 7         :Base(conn,True) 
 8    { 
 9    }
10 } 

 5.  OverLoad the DbConnection.

1  using ( var context =  new TextContext(CreateConnectionWrapper( @" name=TestContext "))) 
2 {                  
3      var product = context.ProductCollection.Find( 1);             
4 }
6. 添加CreateConnectionWrapper 方法
private  static DbConnection CreateConnectionWrapper( string nameOrConnectionString) 
{     
    var providerInvariantName = " System.Data.SqlClient ";     
    var connectionString = nameOrConnectionString;      // name=connectionName format     
    var index = nameOrConnectionString.IndexOf( ' = ');     
    if (nameOrConnectionString.Substring( 0,index).Trim().Equals( " name ", StringComparison.OrdinalIgnoreCase))     
   {
       nameOrConnectionString=nameOrConnectionString.Substring(index +  1).Trim();     
   }     
    // look up connection string name     
    var connectionStringSetting = ConfigurationManager.ConnectionStrings[nameOrConnectionString];     
    if (connectionStringSetting !=  null)     
   {         
       providerInvariantName = connectionStringSetting.ProviderName;
             connectionString = connectionStringSetting.ConnectionString;     
      }     
       // create the special connection string with the provider name in it     
       var wrappedConnectionString = wrappedProvider= "  + providerInvariantName +  "; "  + connectionString;     
       // create the tracing wrapper     
       var connection =  new EFTracingConnection                            
      {                                    
           ConnectionString = wrappedConnectionString                              };     
       // 寫日志logging

      connection.CommandFinished += (sender, args) => Console.WriteLine(args.ToTraceString());    

       return connection; 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM