没有提供表映射

时间:2017-07-26 06:26:34

标签: c# ef-bulkinsert

我目前正在使用hugocl的EntityFramework.BulkInsert-ef6-ext。我的软件目前每天都在运行,我得到了#34;没有提供表格映射。"偶尔,每周大约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;
    }

1 个答案:

答案 0 :(得分:0)

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

我使用ParallelOptions并发现当MaxDegreeOfParallelism == 1时,问题永远不会被复制。

所以,快速解决方法对我来说是: 在我的存储库构造函数中添加 Context.BulkInsert(new SomeEntity [0]) TP_DLAssociatesBeforeRun 而不是您的案例中的SomeEntity)。这就像'预热'并将正确初始化MappedDataReader(在EntityFramework BulkInsert-ef6-ext扩展中使用)。

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