2017-07-26 69 views
0

我目前使用的是由hugocl EntityFramework.BulkInsert-ef6-ext。我的软件目前每天都在运行,并且正在收到“没有提供表格映射”。偶尔有一次,每周大约1到2次,其余的日子都很好。没有提供表映射

下面是错误堆栈跟踪:

at EntityFramework.BulkInsert.Helpers.MappedDataReader`1..ctor(IEnumerable`1 enumerable, IEfBulkInsertProvider provider) 
    at EntityFramework.BulkInsert.Providers.EfSqlBulkInsertProviderWithMappedDataReader.Run[T](IEnumerable`1 entities, SqlTransaction transaction) 
    at EntityFramework.BulkInsert.Providers.ProviderBase`2.Run[T](IEnumerable`1 entities, IDbTransaction transaction) 
    at EntityFramework.BulkInsert.Providers.ProviderBase`2.Run[T](IEnumerable`1 entities) 
    at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, BulkInsertOptions options) 
    at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, SqlBulkCopyOptions sqlBulkCopyOptions, Nullable`1 batchSize) 
    at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, Nullable`1 batchSize) 
    at ADUtility.Logic.Task.GetDLAssociatesBeforeRunTask.<>c__DisplayClass1_0.<Execute>b__0(TP_DLs dl) in ... 

任何人都可以提供关于为什么发生这种情况的任何想法?

下面是我使用的代码:

var dlAssociatesBeforeRun = adHelper.GetDLAssociates(dl.DLName) 
           .Select(x => 
            new TP_DLAssociatesBeforeRun 
            { 
             DLID = dl.ID, 
             ADUsername = x.ADUsername, 
             CreateDate = DateTime.Now, 
             CreateBy = "ADUtility.CLI", 
             UpdateDate = DateTime.Now, 
             UpdateBy = "ADUtility.CLI" 
            }).ToList(); 
          _logger.Trace($"Detected {dlAssociatesBeforeRun.Count} for DL {dl.DLName}"); 
          // ReSharper disable once InvertIf 
          if (dlAssociatesBeforeRun.Any()) 
          { 
           db.BulkInsert(dlAssociatesBeforeRun); 
           db.SaveChanges(); 

下面是GetDLAssociates方法,它基本上只是返回视图模型对象的列表:

public List<DLAssociateViewModel> GetDLAssociates(string groupName, PrincipalContext context = null) 
    { 
     var dlAssociate = new List<DLAssociateViewModel>(); 
     var group = GroupPrincipal.FindByIdentity(context ?? GlobalContext, groupName); 
     if (group == null) 
     { 
      throw new Exception("DL not found on Active Directory"); 
     } 
     dlAssociate.AddRange(group.Members.OfType<UserPrincipal>() 
      .Select(member => new DLAssociateViewModel 
      { 

       DLName = groupName, 
       ADUsername = string.IsNullOrEmpty(member.EmployeeId) ? member.SamAccountName : member.EmployeeId, 
      })); 
     return dlAssociate; 
    } 
+0

请将您的代码直接添加到问题中。 – timiTao

回答

0

我面对完全同样的问题。 我很确定它与某些静态属性有关,并且当我使用多个EF上下文(我正在使用Parallel.ForEach并为每个线程创建专用EF上下文)时发生。

我玩过ParallelOptions,发现MaxDegreeOfParallelism == 1时,这个问题永远不会被复制。

因此,快速的解决方法对我来说是: 添加Context.BulkInsert(新SomeEntity [0])TP_DLAssociatesBeforeRun,而不是SomeEntity你的情况),在我的仓库构造。这就像'预热',并将正确初始化MappedDataReader(用于EntityFramework BulkInsert-ef6-ext扩展名)。

顺便说一句,你不需要db.SaveChanges(); BulkInsert之后的,因为它直接在数据库上执行。