void ImportCore(Func <UnitOfWork> createOutputUow, Func <UnitOfWork> createInputUow, InputObjectClassInfo inputObjectClassInfo) { UnitOfWork inputUow = createInputUow(); UnitOfWork outputUow = createOutputUow(); try { var inputMemberInfos = MemberMapper.MemberInfos(inputObjectClassInfo).OfType <InputMemberInfo>().ToList(); var keys = InputObjectKeys(inputObjectClassInfo, inputUow); int position = 0; int commitAccumulator = 0; int length = keys.Count; while (position < length) { int chunkSize = XpoDefault.GetTerminalInSize(length - position); var keysToImport = keys.GetRange(position, chunkSize); var objectsToImport = inputUow.GetObjectsByKey(inputObjectClassInfo, keysToImport, false); position += chunkSize; commitAccumulator += chunkSize; PrefetchDelayedMembers(inputMemberInfos, inputUow, objectsToImport); ImportMembers(inputObjectClassInfo, objectsToImport, keysToImport, outputUow, inputMemberInfos, inputUow); do { var refsAndImports = RefsAndImports(outputUow); foreach (KeyValuePair <InputMemberInfo, FillRefList> pair in refsAndImports) { var memberInfo = pair.Key.OutputMemberInfo; var fillRefsList = pair.Value; var classInfo = memberInfo.IsAssociationList? memberInfo.CollectionElementType: memberInfo.ReferenceType; var memberList = MemberMapper.MemberInfos(pair.Key.ReferenceType).OfType <InputMemberInfo>().ToList(); var importClassInfo = pair.Key.ReferenceType; var objects = inputUow.GetObjectsByKey(importClassInfo, fillRefsList.RefKeyList, false); PrefetchDelayedMembers(inputMemberInfos, inputUow, objects); ImportRefs(classInfo, objects, fillRefsList, outputUow, inputUow, memberList, memberInfo); } } while (_fillRefsDictionary.Count > 0 || _fillRefsAndImportDictionary.Count > 0); if (commitAccumulator > 400) { outputUow.CommitChanges(); GenerationNext(outputUow); var ou = outputUow; var iu = inputUow; outputUow = createOutputUow(); inputUow = createInputUow(); ou.Dispose(); iu.Dispose(); commitAccumulator = 0; OnTransformingRecords(new TransformingRecordsArgs(inputObjectClassInfo.FullName, inputObjectClassInfo.OutputClassInfo.FullName, position)); } } } finally { outputUow.CommitChanges(); OnTransformRecords(new TransformRecordsArgs(inputObjectClassInfo.FullName, inputObjectClassInfo.OutputClassInfo.FullName)); GenerationNext(outputUow); outputUow.Dispose(); inputUow.Dispose(); } }