2016-07-07 3 views
4

저는 EF6/ASP.NET 4.5 Webforms 솔루션을 실행 중이며 이제는 Excel 파일에서 대량 삽입을 허용하는 몇 가지 기능을 추가해야합니다.EF.BulkInsert와 Glimpse - 함께 놀고 있지 않습니다.

EF는 일괄 작업에 최적화되지 않았으므로 주위를 둘러 보았고 "EF BulkInsert"(https://efbulkinsert.codeplex.com/)를 찾았습니다.

테스트 앱에서 시험해 보았지만 멋지게 작동했습니다.하지만 실제 메인 앱에 포함 시켰을 때 고장났습니다. 실제 대량 삽입 호출을하려고 할 때, 시스템은 예외로 충돌 :

BulkInsertProviderNotFoundException : BulkInsertProvider이 Glimpse.Ado.AlternateType.GlimpseDbConnection '찾을 수 없습니다. 이 의 잘못이 EF BulkInsert (또는 둘 다) 살짝 또는 경우 새로운 프로 바이더 사용 EntityFramework.BulkInsert.ProviderFactory.Register() 메소드 '

가 지금은 확실 해요을 등록하고 불행하게도, I 어떤 해결책도 찾지 못하는 것 같습니다. 소프트웨어의 이러한 부분을 제작하는 사람도 통찰력이나 해결 방법을 제공하지 않습니다.

누구나이 동일한 문제를 발견하고 해결책을 찾았습니까 ?? 엿볼가 DbConnection 및 EF BulkInsert 확장이가없는 민간 분야 "_connectionString"의 접근을 시도 랩 때문에

답변

6

이 문제가 발생합니다. 나는 비난 할 것이다 EF BulkInsert 개인 회원에 액세스하는 것은 나쁜 습관 일 뿐이며 Glimpse 팀의 개발자는이를 예상 할 수 없었습니다.

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

감사합니다. 정말 도움이되었습니다. –