protected virtual Dictionary <object, IList> LoadObjectInstancesToList(Type objectTypeToLoad, Table objectTypeToLoadTable, Dictionary <object, object> parentPKToObjectMap, IDictionary <string, DbAppendSelectWhereClause> appendSelectWhereClauseMap, ColumnCachedValues cachedValues, MappingContext mappingContext, IDbCommand command) { if (objectTypeToLoadTable == null) { objectTypeToLoadTable = mappingContext.GetTableForType(objectTypeToLoad); } Dictionary <object, IList> list = null; if (!string.IsNullOrEmpty(objectTypeToLoadTable.SelectSql)) { command.CommandText = objectTypeToLoadTable.SelectSql; command.CommandType = CommandType.Text; command.Parameters.Clear(); AppendSelectWhereClause(objectTypeToLoadTable.TableName, command, appendSelectWhereClauseMap); list = LoadObjectInstancesToList(objectTypeToLoadTable, parentPKToObjectMap, appendSelectWhereClauseMap, cachedValues, mappingContext, command); } return(list); }
protected virtual void SaveToDatabase(object parentOfObjectToSave, object objectToSave, Table tableOfObjectToSave, ColumnCachedValues cachedValues, MappingContext mappingContext, Dictionary <string, int> insertRowCounts, IDbCommand command) { if (objectToSave == null) { return; } Type objectToSaveType = objectToSave.GetType(); if (tableOfObjectToSave == null) { tableOfObjectToSave = mappingContext.GetTableForType(objectToSaveType); } Table parentTable = null; if (parentOfObjectToSave != null) { parentTable = mappingContext.GetTableForType(parentOfObjectToSave.GetType()); } if (tableOfObjectToSave.PopulateInsertValues(command, parentOfObjectToSave, parentTable, objectToSave, cachedValues)) { DebugUtils.AssertDebuggerBreak(command.Parameters.Count == tableOfObjectToSave.AllColumns.Count); try { command.ExecuteNonQuery(); } catch (Exception) { DebugUtils.CheckDebuggerBreak(); throw; } if (insertRowCounts != null) { int value; if (insertRowCounts.TryGetValue(tableOfObjectToSave.TableName, out value)) { value++; } else { value = 1; } insertRowCounts[tableOfObjectToSave.TableName] = value; } } // Save children if (tableOfObjectToSave.ChildRelationMembers != null) { try { Dictionary <object, bool> alreadyProcessedMemberValues = new Dictionary <object, bool>(tableOfObjectToSave.ChildRelationMembers.Count); foreach (ChildRelationInfo childRelation in tableOfObjectToSave.ChildRelationMembers) { object relationMember = objectToSave; if (childRelation.ParentToMemberChain != null) { foreach (SameTableElementInfo sameTableElementInfo in childRelation.ParentToMemberChain) { relationMember = sameTableElementInfo.GetMemberValue(relationMember); if (relationMember == null) { break; } } } if (relationMember != null) { if (childRelation.IsOneToMany) { IEnumerable memberEnumerable = childRelation.GetMemberEnumerable(relationMember); if (memberEnumerable != null) { if (alreadyProcessedMemberValues.ContainsKey(memberEnumerable)) { // This is for object[] members that may be mapped to multiple types } else { bool insertedAny = false; alreadyProcessedMemberValues[memberEnumerable] = true; Table elementTable = null; if (Utils.IsValidColumnType(childRelation.ValueType)) { elementTable = childRelation.ChildTable; } foreach (object element in memberEnumerable) { if (element != null) { SaveToDatabase(objectToSave, element, elementTable, cachedValues, mappingContext, insertRowCounts, command); insertedAny = true; } } if (!insertedAny) { } } } } else // One to one { object element = childRelation.GetMemberValue(relationMember); if (element != null) { if (alreadyProcessedMemberValues.ContainsKey(element)) { // This is for object members that may be mapped to multiple types } else { alreadyProcessedMemberValues[element] = true; Table elementTable = null; if (Utils.IsValidColumnType(childRelation.ValueType)) { elementTable = childRelation.ChildTable; } if (element != null) { SaveToDatabase(objectToSave, element, elementTable, cachedValues, mappingContext, insertRowCounts, command); } } } } } } } catch (Exception) { DebugUtils.CheckDebuggerBreak(); throw; } } }