public TwoWayDataMap(EntityToUpdateDefinition sourceDefinition, EntityToUpdateDefinition targetDefinition, JoinFieldCollection joinKeys, Func <DataRow, ConflictResolutionResult> conflictResolutionRule) : base(joinKeys, conflictResolutionRule) { if (sourceDefinition == null) { throw new Exception("Source entity definition can not be null."); } if (sourceDefinition.SyncSide != SyncSide.Source) { throw new Exception("Source entity definition can not be configured as target-side."); } if (targetDefinition == null) { throw new Exception("Target entity definition can not be null."); } if (targetDefinition.SyncSide != SyncSide.Target) { throw new Exception("Target entity definition can not be configured as source-side."); } SourceDefinition = sourceDefinition; TargetDefinition = targetDefinition; }
private static EntityRecord AddDeletionToBatch(OneToMany_OneWayDataMap map, EntityBatch batch, Dictionary <string, DataOnlyField> dataOnlyFields, DataRow oneSideRow, IEnumerable <DataRow> manySideFilteredRows, TransposeResult transposeResult, Dictionary <string, string> transposeDataOnlyValues) { var transposeRecordToDelete = (TransposeResult_DeleteRecord)transposeResult; var recordToDelete = new RecordToDelete(batch, transposeRecordToDelete.PrimaryKeyValues); foreach (var transposeDataOnlyValue in transposeDataOnlyValues) { recordToDelete.DataOnlyValues.Add(transposeDataOnlyValue.Key, transposeDataOnlyValue.Value); } foreach (var dataOnlyField in dataOnlyFields) { if (!recordToDelete.DataOnlyValues.ContainsKey(dataOnlyField.Key)) { if (dataOnlyField.Value.MethodToPopulateValue == null) { recordToDelete.DataOnlyValues.Add(dataOnlyField.Key, (transposeRecordToDelete.AssociatedManySideDataRow[dataOnlyField.Key] ?? "").ToString()); } else if (dataOnlyField.Value.MethodToPopulateValue != null) { recordToDelete.DataOnlyValues.Add(dataOnlyField.Key, (dataOnlyField.Value.MethodToPopulateValue(oneSideRow) ?? "").ToString()); } } } // add primary keys, if not auto-generate or not custom if (EntityToUpdateDefinition.HasManualGeneratedPrimaryKey(map, batch.EntityDefinition.SyncSide)) { foreach (var primarKeyColumnName in batch.EntityDefinition.PrimaryKeyColumnNames) { recordToDelete.PrimaryKeyValues.Add(recordToDelete.DataOnlyValues[primarKeyColumnName]); } } batch.RecordsToDelete.Add(recordToDelete); var customSetFieldsForDelete = map.CustomSetFields.Where(d => d.AppliesTo.HasFlag(SyncOperation.Deletes) || d.AppliesTo.HasFlag(SyncOperation.All)); if (customSetFieldsForDelete.Count() > 0) { var transposeResultForUpdate = new TransposeResult_UpdateRecord(transposeRecordToDelete.AssociatedManySideDataRow, transposeRecordToDelete.PrimaryKeyValues, null); var recordToUpdate = GetUpdateRecord(map, batch, dataOnlyFields, oneSideRow, manySideFilteredRows, transposeResultForUpdate, transposeDataOnlyValues, customSetFieldsForUpdate: customSetFieldsForDelete); if (recordToUpdate.FieldValuePairs.Count > 0) { batch.RecordsToUpdate.Add(recordToUpdate); } } return(recordToDelete); }
private static void AddSecondaryKeyValues(EntityToUpdateDefinition entityToUpdateDefinition, ref RecordToUpdate recordToUpdate) { var secondaryKeyColumnNames = entityToUpdateDefinition.SecondaryKeyColumnNames; if (secondaryKeyColumnNames != null && secondaryKeyColumnNames.Count > 0) { recordToUpdate.SecondaryKeyValues = new List <string>(); foreach (var secondaryKeyColumnName in secondaryKeyColumnNames) { recordToUpdate.SecondaryKeyValues.Add(recordToUpdate.DataOnlyValues[secondaryKeyColumnName]); } } }
public OneWayDataMap(SyncDirection syncDirection, JoinFieldCollection joinKeys, EntityToUpdateDefinition entityToUpdateDefinition) : base(joinKeys, GetConflictResolutionRule(syncDirection)) { if (entityToUpdateDefinition == null) { throw new Exception("The definition for the entity to update can not be null."); } if (entityToUpdateDefinition.SyncSide == SyncSide.Target && syncDirection != SyncDirection.SourceToTarget) { throw new Exception("Target-side entity can not be updated when sync direction is target -> source."); } else if (entityToUpdateDefinition.SyncSide == SyncSide.Source && syncDirection != SyncDirection.TargetToSource) { throw new Exception("Source-side entity can not be updated when sync direction is source -> target."); } SyncDirection = syncDirection; EntityToUpdateDefinition = entityToUpdateDefinition; }
public OneToMany_OneWayDataMap(SyncDirection syncDirection, JoinFieldCollection joinKeys, EntityToUpdateDefinition entityToUpdateDefinition, HashSet <string> columnNamesToTranspose, Func <IEnumerable <DataRow>, DataRow, string, TransposeResult> transposeMethod) : base(joinKeys) { if (entityToUpdateDefinition == null) { throw new Exception("The definition for the entity to update can not be null."); } if (entityToUpdateDefinition.SyncSide == SyncSide.Target && syncDirection != SyncDirection.SourceToTarget) { throw new Exception("Target-side entity can not be updated when sync direction is target -> source."); } else if (entityToUpdateDefinition.SyncSide == SyncSide.Source && syncDirection != SyncDirection.TargetToSource) { throw new Exception("Source-side entity can not be updated when sync direction is source -> target."); } if (columnNamesToTranspose == null || columnNamesToTranspose.Count == 0) { throw new Exception("At least one column name to transpose is required."); } if (transposeMethod == null) { throw new Exception("Transpose method can not be null."); } SyncDirection = syncDirection; EntityToUpdateDefinition = entityToUpdateDefinition; ColumnNamesToTranspose = columnNamesToTranspose; TransposeMethod = transposeMethod; }
private static EntityRecord AddInsertToBatch(OneToMany_OneWayDataMap map, EntityBatch batch, Dictionary <string, DataOnlyField> dataOnlyFields, DataRow oneSideRow, TransposeResult transposeResult, Dictionary <string, string> transposeDataOnlyValues) { var transposeRecordToAdd = (TransposeResult_AddRecord)transposeResult; var recordToAdd = new RecordToAdd(batch); foreach (var fieldValuePair in transposeRecordToAdd.FieldValuePairs) { recordToAdd.FieldValuePairs.Add(fieldValuePair.Key, fieldValuePair.Value); } foreach (var transposeDataOnlyValue in transposeDataOnlyValues) { recordToAdd.DataOnlyValues.Add(transposeDataOnlyValue.Key, transposeDataOnlyValue.Value); } foreach (var dataOnlyField in dataOnlyFields) { if (!recordToAdd.DataOnlyValues.ContainsKey(dataOnlyField.Key)) { if (dataOnlyField.Value.MethodToPopulateValue == null && transposeRecordToAdd.FieldValuePairs.ContainsKey(dataOnlyField.Key)) { recordToAdd.DataOnlyValues.Add(dataOnlyField.Key, transposeRecordToAdd.FieldValuePairs[dataOnlyField.Key]); } else if (dataOnlyField.Value.MethodToPopulateValue != null) { recordToAdd.DataOnlyValues.Add(dataOnlyField.Key, (dataOnlyField.Value.MethodToPopulateValue(oneSideRow) ?? "").ToString()); } else { if (batch.EntityDefinition.SyncSide == SyncSide.Source) { throw new Exception(string.Format("Source-side data only field '{0}' is not mapped.", dataOnlyField.Key)); } else if (batch.EntityDefinition.SyncSide == SyncSide.Target) { throw new Exception(string.Format("Target-side data only field '{0}' is not mapped.", dataOnlyField.Key)); } else { throw new EnumValueNotImplementedException <SyncSide>(batch.EntityDefinition.SyncSide); } } } } var customSetFieldsForInsert = map.CustomSetFields .Where(d => (d.AppliesTo.HasFlag(SyncOperation.Inserts) || d.AppliesTo.HasFlag(SyncOperation.All))); foreach (var customSetField in customSetFieldsForInsert) { var customSetValue = customSetField.CustomSetMethod(oneSideRow); var value = customSetValue == null ? null : customSetValue.ToString(); recordToAdd.AddFieldValuePair(customSetField.FieldNameToUpdate, value); // add as data only field, if applicable if (dataOnlyFields.ContainsKey(customSetField.FieldNameToUpdate) && dataOnlyFields[customSetField.FieldNameToUpdate].MethodToPopulateValue == null) { recordToAdd.DataOnlyValues.Add(customSetField.FieldNameToUpdate, value); } } // add primary keys, if not auto-generate or not custom if (EntityToUpdateDefinition.HasManualGeneratedPrimaryKey(map, batch.EntityDefinition.SyncSide)) { foreach (var primarKeyColumnName in batch.EntityDefinition.PrimaryKeyColumnNames) { recordToAdd.PrimaryKeyValues.Add(recordToAdd.DataOnlyValues[primarKeyColumnName]); } } // add secondary keys, if applicable if (batch.EntityDefinition.SecondaryKeyColumnNames != null && batch.EntityDefinition.SecondaryKeyColumnNames.Count > 0) { recordToAdd.SecondaryKeyValues = new List <string>(); foreach (var secondaryKeyColumnName in batch.EntityDefinition.SecondaryKeyColumnNames) { recordToAdd.SecondaryKeyValues.Add(recordToAdd.DataOnlyValues[secondaryKeyColumnName]); } } if (recordToAdd.FieldValuePairs.Count > 0) { batch.RecordsToAdd.Add(recordToAdd); } return(recordToAdd); }