void ImportManyToManyCollection(UnitOfWork outputUow, UnitOfWork intputUow, object xpoObject, ImportedMemberInfo importedMemberInfo, object objectToImport, InputMemberInfo memberInfo) { if (!importedMemberInfo.InitialData.DataProvider) return; var xpClassInfo = intputUow.Dictionary.GetClassInfo(null, importedMemberInfo.InitialData.DataProviderTableName); var criteriaOperator = CriteriaOperator.Parse(importedMemberInfo.InitialData.DataProviderQueryColumnName + "=?", objectToImport); using (var xpCollection = new XPCollection(intputUow, xpClassInfo, criteriaOperator)) { var collection = (XPBaseCollection)memberInfo.GetValue(xpoObject); var dataProviderResultInfo = xpClassInfo.GetMember(importedMemberInfo.InitialData.DataProviderResultColumnName); foreach (var o in xpCollection) { var listElementTypeInfo = memberInfo.CollectionElementType; var memberValue = dataProviderResultInfo.GetValue(o); bool returnKey; bool returnImportKey; var referenceMemberValue = GetReferenceMemberValue(outputUow, memberValue, listElementTypeInfo.ClassType, out returnKey, out returnImportKey); if (returnKey) { AddFillRefInfo(memberInfo, xpoObject, referenceMemberValue); } if (returnImportKey) { AddFillRefAndImportInfo(memberInfo, xpoObject, referenceMemberValue); } else { collection.BaseAdd(referenceMemberValue); } } } }
object ImportSingle(object objectKeyToImport, object objectToImport, UnitOfWork outputUow, UnitOfWork inputUow, XPClassInfo classInfo, IEnumerable<InputMemberInfo> memberInfos) { var objectDictionary = GetObjectDictionary(classInfo.ClassType); var xpoObject = CreateInstance(classInfo.ClassType, outputUow); AddObjectToCache(objectDictionary, objectKeyToImport, xpoObject); foreach (var memberInfo in memberInfos) { var importedMemberInfo = new ImportedMemberInfo(classInfo, memberInfo); if (importedMemberInfo.MemberInfo.IsAssociationList) { ImportManyToManyCollection(outputUow, inputUow, xpoObject, importedMemberInfo, objectToImport, memberInfo); } else { ImportSimpleProperty(outputUow, inputUow, memberInfo, importedMemberInfo, objectToImport, xpoObject); } } return xpoObject; }
void ImportSimpleProperty(UnitOfWork outputUow, UnitOfWork inputUow, InputMemberInfo memberInfo, ImportedMemberInfo importedMemberInfo, object objectToImport, object xpoObject) { XPMemberInfo xpMemberInfo = importedMemberInfo.MemberInfo; if (xpMemberInfo != null) { var value = xpMemberInfo.GetValue(objectToImport); if (memberInfo.ReferenceType != null && memberInfo.ReferenceType.IsPersistent) { var memberType = ((InputObjectClassInfo)memberInfo.ReferenceType).OutputClassInfo.ClassType; bool returnKey; bool returnImportKey; value = GetReferenceMemberValue(outputUow, value, memberType, out returnKey, out returnImportKey); if (returnKey) { AddFillRefInfo(memberInfo, xpoObject, value); return; } if (returnImportKey) { value = inputUow.GetKeyValue(value); AddFillRefAndImportInfo(memberInfo, xpoObject, value); return; } } memberInfo.SetOutputMemberValue(xpoObject, value); } }
void ImportMembers(InputObjectClassInfo inputObjectClassInfo, ICollection objectsToImport, List<object> keysToImport, UnitOfWork outputUow, List<InputMemberInfo> inputMemberInfos, UnitOfWork inputUow) { int keysCounter = 0; var objectDictionary = GetObjectDictionary(inputObjectClassInfo.OutputClassInfo.ClassType); foreach (var objectToImport in objectsToImport) { object objectKey = keysToImport[keysCounter++]; if (objectDictionary.ContainsKey(objectKey)) continue; var xpoObject = CreateInstance(inputObjectClassInfo.OutputClassInfo.ClassType, outputUow); AddObjectToCache(objectDictionary, objectKey, xpoObject); foreach (var inputMemberInfo in inputMemberInfos) { var importedMemberInfo = new ImportedMemberInfo(inputObjectClassInfo, inputMemberInfo); if (inputMemberInfo.IsAssociationList) { ImportManyToManyCollection(outputUow, inputUow, xpoObject, importedMemberInfo, objectToImport, inputMemberInfo); } else { ImportSimpleProperty(outputUow, inputUow, inputMemberInfo, importedMemberInfo, objectToImport, xpoObject); } } } }