2016-07-07 37 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

谢谢,这真的很有帮助! –