/// <summary> /// Maps a collection of components or entities /// </summary> /// <param name="modelInspector">The model inspector</param> /// <param name="property">The property to map</param> /// <param name="mapper">The collections mapper</param> private void MapCollection(IModelInspector modelInspector, PropertyPath property, ICollectionPropertiesMapper mapper) { Type sourceType = property.GetContainerEntity(modelInspector); Type targetType = property.LocalMember.GetPropertyOrFieldType().DetermineCollectionElementType(); var primaryKeyProperty = modelInspector.GetIdentifierMember(sourceType); var foreignKeyProperty = property.LocalMember; string foreignKeyColumnName = null; string foreignKeyName = null; string tableName = null; string schemaName = null; if (modelInspector.IsEntity(targetType)) { // Entity Relationship Mapping if (modelInspector.IsManyToManyItem(property.LocalMember)) { // Many to many foreignKeyColumnName = namingEngine.ToManyToManyForeignKeyColumnName(sourceType, primaryKeyProperty); foreignKeyName = namingEngine.ToManyToManyForeignKeyName(sourceType, targetType, sourceType, primaryKeyProperty); tableName = namingEngine.ToManyToManyTableName(sourceType, targetType); schemaName = namingEngine.ToSchemaName(sourceType, targetType); } else { // One to Many foreignKeyColumnName = namingEngine.ToForeignKeyColumnName(sourceType, primaryKeyProperty); foreignKeyName = namingEngine.ToForeignKeyName(targetType, sourceType, sourceType, primaryKeyProperty); } } else if (IsElement(targetType)) { // Element mapping foreignKeyColumnName = namingEngine.ToForeignKeyColumnName(sourceType, primaryKeyProperty); foreignKeyName = namingEngine.ToComponentForeignKeyName(targetType, sourceType, foreignKeyProperty, primaryKeyProperty); tableName = namingEngine.ToElementTableName(sourceType, targetType, property.LocalMember); schemaName = namingEngine.ToSchemaName(sourceType, targetType); } else { // Component Relationship Mapping foreignKeyColumnName = namingEngine.ToForeignKeyColumnName(sourceType, primaryKeyProperty); foreignKeyName = namingEngine.ToComponentForeignKeyName(targetType, sourceType, foreignKeyProperty, primaryKeyProperty); tableName = namingEngine.ToComponentTableName(sourceType, targetType, property.LocalMember); schemaName = namingEngine.ToSchemaName(sourceType, targetType); } // Mapping mapper.Schema(schemaName); mapper.Table(tableName); mapper.Key(k => { k.Column(foreignKeyColumnName); k.ForeignKey(foreignKeyName); }); }
private static void OnBeforeMapCollection(IModelInspector inspector, PropertyPath member, ICollectionPropertiesMapper customizer) { customizer.Key(mapper => { mapper.Column(columnMapper => columnMapper.Name(member.GetContainerEntity(inspector).Name + "Id")); if (inspector.IsManyToManyItem(member.LocalMember)) { mapper.ForeignKey( $"FK_{member.GetContainerEntity(inspector).Name.ToUpper()}_{member.LocalMember.Name.ToUpper()}_{member.GetContainerEntity(inspector).Name + "Id"}"); } else { var a = member.LocalMember.GetPropertyOrFieldType(); if (a.IsEnumerable(out var elementType)) { mapper.ForeignKey( $"FK_{elementType.Name.ToUpper()}_{member.GetContainerEntity(inspector).Name.ToUpper()}"); } } }); if (inspector.IsManyToManyItem(member.LocalMember)) { customizer.Table(member.LocalMember.DeclaringType.Name + "_" + member.LocalMember.Name); } else { if (member.LocalMember.GetPropertyOrFieldType().IsEnumerable(out var elementType) && typeof(Entity).IsAssignableFrom(elementType)) { var parentRef = elementType .GetProperties() .Single(p => p.PropertyType == member.GetContainerEntity(inspector)); customizer.Key(o => o.Column($"{parentRef.Name}Id")); customizer.Inverse(true); } customizer.Cascade(Cascade.All | Cascade.DeleteOrphans); } }