/// <summary> /// Creates a <see cref="DataMergeDefinition" /> from the specified <paramref name="importContext" />. /// </summary> /// <param name="importContext">The import context.</param> /// <returns> /// An instance of <see cref="DataMergeDefinition" /> /// </returns> /// <exception cref="InvalidOperationException">Could not find matching field definition for data column</exception> protected virtual DataMergeDefinition CreateMergeDefinition(ImportProcessContext importContext) { var importDefinition = importContext.Definition; var mergeDefinition = new DataMergeDefinition(); mergeDefinition.TargetTable = importDefinition.TargetTable; mergeDefinition.IncludeInsert = importDefinition.CanInsert; mergeDefinition.IncludeUpdate = importDefinition.CanUpdate; // fluent builder var mergeMapping = new DataMergeMapping(mergeDefinition); // map included columns foreach (var fieldMapping in importContext.MappedFields) { var fieldDefinition = fieldMapping.Definition; var nativeType = SqlTypeMapping.NativeType(fieldDefinition.DataType); mergeMapping .Column(fieldDefinition.Name) .Insert(fieldDefinition.CanInsert) .Update(fieldDefinition.CanUpdate) .Key(fieldDefinition.IsKey) .NativeType(nativeType); } return(mergeDefinition); }
/// <summary> /// Automatics the map the properties of type <typeparamref name="TEntity"/> to the specified <see cref="DataMergeDefinition"/> . /// </summary> /// <typeparam name="TEntity">The type of the entity.</typeparam> /// <param name="mergeDefinition">The merge definition up auto map to.</param> public static void AutoMap <TEntity>(DataMergeDefinition mergeDefinition) { var entityType = typeof(TEntity); var properties = TypeDescriptor.GetProperties(entityType); var tableAttribute = Attribute.GetCustomAttribute(entityType, typeof(TableAttribute)) as TableAttribute; if (tableAttribute != null) { string targetTable = tableAttribute.Name; if (!string.IsNullOrEmpty(tableAttribute.Schema)) { targetTable = tableAttribute.Schema + "." + targetTable; } mergeDefinition.TargetTable = targetTable; } if (string.IsNullOrEmpty(mergeDefinition.TargetTable)) { mergeDefinition.TargetTable = entityType.Name; } foreach (PropertyDescriptor p in properties) { string sourceColumn = p.Name; string targetColumn = sourceColumn; string nativeType = SqlTypeMapping.NativeType(p.PropertyType); var columnAttribute = p.Attributes .OfType <ColumnAttribute>() .FirstOrDefault(); if (columnAttribute != null) { if (columnAttribute.Name.HasValue()) { targetColumn = columnAttribute.Name; } if (columnAttribute.TypeName.HasValue()) { nativeType = columnAttribute.TypeName; } } var mergeColumn = mergeDefinition.Columns.FirstOrAdd( m => m.SourceColumn == sourceColumn, () => new DataMergeColumn { SourceColumn = sourceColumn }); mergeColumn.TargetColumn = targetColumn; mergeColumn.NativeType = nativeType; var keyAttribute = p.Attributes .OfType <KeyAttribute>() .FirstOrDefault(); if (keyAttribute != null) { mergeColumn.IsKey = true; mergeColumn.CanUpdate = false; } var ignoreAttribute = p.Attributes .OfType <NotMappedAttribute>() .FirstOrDefault(); if (ignoreAttribute != null) { mergeColumn.IsIgnored = true; } } }