首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EntityFramework.BulkInsert抛出KeyNotFoundException

EntityFramework.BulkInsert抛出KeyNotFoundException
EN

Stack Overflow用户
提问于 2015-11-16 19:49:36
回答 1查看 1.9K关注 0票数 0

我试图使用实体框架6的批量插入扩展,但是,当我调用"BulkInsert“方法时,我似乎得到了一个BulkInsert。

以下是相关代码:

代码语言:javascript
运行
复制
        using (var context = new SupportContext(request.CustomerId))
        {
            using (var transactionScope = new TransactionScope())
            {
                var freeIds =
                    Enumerable.Range(1, 89999)
                        .Except(
                            context.TagAssociationTypes.Where(n => n.TagAssociationTypeID <= 89999)
                                .Select(n => n.TagAssociationTypeID))
                        .ToList();
                var nfeList = context.NumericalFunctionEnums.ToList();
                var processedTats = new List<TagAssociationType>();
                foreach (var item in request.Tats)
                {
                    var groupingNFE = nfeList.FirstOrDefault(n => n.nfe_description == item.GroupingNFE.Value);
                    var summaryNFE = nfeList.FirstOrDefault(n => n.nfe_description == item.SummaryNFE.Value);
                    var tatId = freeIds.Min();

                    var newItem = new TagAssociationType
                    {
                        TagAssociationTypeID = tatId,
                        Name = item.TagAssociationTypeName.Value,
                        GroupingFunctionID = groupingNFE != null ? groupingNFE.nfe_id : 0,
                        SummaryFunctionID = summaryNFE!= null ? summaryNFE.nfe_id : 0
                    };

                    processedTats.Add(newItem);
                    freeIds.Remove(tatId);
                }
                context.BulkInsert(processedTats);
                transactionScope.Complete();
            }
        }

和StackTrace

代码语言:javascript
运行
复制
System.Collections.Generic.KeyNotFoundException was unhandled by user code
  HResult=-2146232969
  Message=The given key was not present in the dictionary.
  Source=mscorlib
  StackTrace:
       at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
       at EntityFramework.MappingAPI.Mappers.MapperBase.BindForeignKeys() in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappers\MapperBase.cs:line 603
       at EntityFramework.MappingAPI.Mappings.DbMapping..ctor(DbContext context) in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappings\DbMapping.cs:line 101
       at EntityFramework.MappingAPI.EfMap.Get(DbContext context) in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\EfMap.cs:line 60
       at EntityFramework.MappingAPI.Extensions.MappingApiExtensions.Db(DbContext ctx, Type type) in c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Extensions\MappingApiExtensions.cs:line 51
       at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
       at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector)
       at EntityFramework.BulkInsert.Helpers.MappedDataReader`1..ctor(IEnumerable`1 enumerable, IEfBulkInsertProvider provider) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Helpers\MappedDataReader.cs:line 58
       at EntityFramework.BulkInsert.Providers.EfSqlBulkInsertProviderWithMappedDataReader.Run[T](IEnumerable`1 entities, SqlTransaction transaction, BulkInsertOptions options) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\EfSqlBulkInsertProviderWithMappedDataReader.cs:line 22
       at EntityFramework.BulkInsert.Providers.ProviderBase`2.Run[T](IEnumerable`1 entities, IDbTransaction transaction, BulkInsertOptions options) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:line 77
       at EntityFramework.BulkInsert.Providers.ProviderBase`2.Run[T](IEnumerable`1 entities, BulkInsertOptions options) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:line 105
       at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, SqlBulkCopyOptions sqlBulkCopyOptions, Nullable`1 batchSize) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsertExtension.cs:line 95
       at EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext context, IEnumerable`1 entities, Nullable`1 batchSize) in c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsertExtension.cs:line 75
       at SupportCenter.Controllers.Api.BulkLocalTatController.InsertTats(VerifyQuery request)
       at lambda_method(Closure , Object , Object[] )
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
  InnerException: 

我不完全确定到底是什么导致了这一切。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-17 15:59:18

因此,在深入研究之后,我发现这与MappingAPI试图映射我的模型上的所有虚拟属性有关。为了纠正这个问题,我创建了一些特殊的模型,剔除了所有的虚拟属性,并且只包括了插入所需的属性。

在那里,我为我试图插入的模型创建了一个单独的上下文。我不包括上下文中的任何映射。

这种方法似乎工作得很好,但有几个缺点。对于可能跨越许多不同模型的复杂对象,我可能需要使用两个单独的数据库上下文。您还必须将上下文与其他上下文分离,在它们的using语句块中不存在重叠,否则会导致TransactionScope抛出错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33743419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档