2016-07-07 12 views
4

私が稼働してEF6/ASP.NET 4.5 Webフォームのソリューションを持っている、そして今私はExcelファイルからの一括挿入を可能にするために、いくつかの機能を追加する必要があります。EF.BulkInsertと垣間見る - 一緒にプレーしていないがよく

EFはすぐに使用できることがわかっていますので、私は周りを見渡し、これを容易にするために "EF BulkInsert"(https://efbulkinsert.codeplex.com/)が見つかりました。

私はテストアプリケーションでそれを試みたが、それは見事に働いた - しかし、私は私の実際のメインのアプリでそれを含めたときに、それが決裂しました。実際の一括挿入呼び出しを実行しようとすると、システムは例外でクラッシュ:

BulkInsertProviderNotFoundException:BulkInsertProviderがGlimpse.Ado.AlternateType.GlimpseDbConnection」が見つかりません。新しいプロバイダの使用EntityFramework.BulkInsert.ProviderFactory.Register()メソッド」

を登録するには今、私は、私は、残念ながらこれは垣間見るまたはEF BulkInsert(あるいはその両方)の故障であればわからないよ、とどのような解決策も見つけられないようです - これらのソフトウェアのメーカーはどちらも洞察力や回避策を提供していません....

誰もがこの同じ問題を遭遇し、解決策を見つけましたか? 垣間見るはたDbConnectionをラップし、EF BulkInsert拡張子はそれがありませんプライベートフィールド「_connectionString」のアクセスしようとするため、

答えて

6

、この問題が発生します。 プライベートメンバーにアクセスするだけで悪い習慣があると垣間見るチームには、開発者がそれを予想していない可能性があるので、私はこのケースでEF BulkInsertのせいでしょう。今、どこかにこのプロバイダを登録

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"); } 
     } 
    } 

:私はEfSqlBulkInsertProviderWithMappedDataReader(デフォルトプロバイダ)から継承するカスタムを書かれているこの問題を解決するために

。私はコンテキストOnModelCreatingメソッドでそれをやった。

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

私だけEF BulkInsertの基本的な使用方法でこれをテストしたことに注意してください。

+1

ありがとうございます - 魅力のように動作します! –

+0

ありがとう、本当に役に立ちました! –

関連する問題