2016-07-07 36 views
4

我有一個EF6/ASP.NET 4.5 Webforms解決方案啓動並運行,現在我需要添加一些功能來允許從Excel文件中批量插入。EF.BulkInsert和Glimpse - 沒有一起玩

我知道,開箱即用的EF沒有針對批量操作進行優化,所以我環顧四周,找到了「EF BulkInsert」(https://efbulkinsert.codeplex.com/)以便於實現此目的。

我在一個測試應用程序中嘗試過它,它運行得非常好 - 但是當我將它包含在我的實際主應用程序中時,它就崩潰了。當試圖做實際批量插入電話時,系統崩潰與一個例外:沒有發現「Glimpse.Ado.AlternateType.GlimpseDbConnection BulkInsertProvider:

BulkInsertProviderNotFoundException。要註冊新的供應商使用EntityFramework.BulkInsert.ProviderFactory.Register()方法」

現在我不能確定這是否是故障一瞥EF BulkInsert(或兩者),不幸的是,我似乎無法找到任何解決方案 - 這些軟件的製造商都沒有提供任何見解或解決方法....

有沒有人在這裏偶然發現了同樣的問題,並找到了解決方案?發生

回答

6

此問題的原因掠影包裝的DbConnection和EF BulkInsert擴展嘗試訪問它的私有字段「_connectionString」,這是不存在的。 我會責怪EF BulkInsert在這種情況下,訪問私人成員只是不好的做法,Glimpse團隊中沒有任何開發人員可以預料到這一點。

爲了解決這個問題,我已經寫了從EfSqlBulkInsertProviderWithMappedDataReader(默認提供)繼承的自定義:

public class GlimpseProvider : EfSqlBulkInsertProviderWithMappedDataReader, IEfBulkInsertProvider 
    { 

     private static object GetPrivateFieldValue(object obj, string propName) { 
      if (obj == null) throw new ArgumentNullException("obj"); 
      Type t = obj.GetType(); 
      FieldInfo fieldInfo = null; 
      PropertyInfo propertyInfo = null; 
      while (fieldInfo == null && propertyInfo == null && t != null) { 
       fieldInfo = t.GetField(propName, 
        BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 
       if (fieldInfo == null) { 
        propertyInfo = t.GetProperty(propName, 
         BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 
       } 

       t = t.BaseType; 
      } 
      if (fieldInfo == null && propertyInfo == null) 
       throw new ArgumentOutOfRangeException("propName", 
        string.Format("Field {0} was not found in Type {1}", propName, obj.GetType().FullName)); 

      if (fieldInfo != null) 
       return fieldInfo.GetValue(obj); 

      return propertyInfo.GetValue(obj, null); 
     } 

     protected override IDbConnection DbConnection { 
      get { return (IDbConnection)GetPrivateFieldValue(this.Context.Database.Connection, "InnerConnection"); } 
     } 
    } 

現在的地方註冊這個提供。我在上下文OnModelCreating方法中做了它。

EntityFramework.BulkInsert.ProviderFactory.Register<GlimpseProvider>("Glimpse.Ado.AlternateType.GlimpseDbConnection"); 

要知道,我只用EF BulkInsert的基本用法測試這一點。

+1

非常感謝 - 作品魅力! –

+0

謝謝,這真的很有幫助! –