/// <summary> /// Sets the following conventions: /// 1) Foreign key fields are named as the property name suffixed by the value of _foreignKeyColumnSuffix. /// 2) Many to Many link tables are named as the object type names sorted alphabetically with the _manyToManyLinkTableInsert inserted inbetween them. /// </summary> private void BeforeMappingCollectionConvention( IModelInspector inspector, PropertyPath member, ICollectionPropertiesMapper customizer) { string tableName; if (inspector.IsManyToMany(member.LocalMember)) { tableName = this.GetManyToManyLinkTableName(member); customizer.Table(tableName); } else { tableName = member.GetCollectionElementType().Name; } string columnName = this.GetKeyColumnName(inspector, member); string foreignKeyName = $"{this._foreignKeyNamePrefix}{tableName}_{columnName}"; customizer.Key( k => { k.Column(columnName); k.ForeignKey(foreignKeyName); }); }
protected virtual void OnBeforeMappingCollectionConvention(IModelInspector modelinspector, PropertyPath member, ICollectionPropertiesMapper collectionPropertiesCustomizer) { if (modelinspector.IsManyToMany(member.LocalMember)) { collectionPropertiesCustomizer.Table(member.ManyToManyIntermediateTableName("To")); } if (modelinspector.IsSet(member.LocalMember)) { // If otherside has many-to-one, make it inverse, if not specify foreign key on Key element MemberInfo oneToManyProperty = member.OneToManyOtherSideProperty(); IEnumerable <MemberInfo> candidatesManyToOne = MembersProvider .GetRootEntityMembers(oneToManyProperty.DeclaringType) .Where(modelinspector.IsManyToOne); if (candidatesManyToOne.Any(mi => mi.MemberType() == member.LocalMember.DeclaringType)) { collectionPropertiesCustomizer.Inverse(true); } else { Contract.Assert(oneToManyProperty.DeclaringType != null, "otherSideProperty.DeclaringType != null"); collectionPropertiesCustomizer.Key(k => k.ForeignKey(string.Format("FK_{0}_{1}", oneToManyProperty.DeclaringType.Name, oneToManyProperty.Name))); } } collectionPropertiesCustomizer.Key(k => k.Column(GetKeyColumnName(modelinspector, member))); }
private void BeforeMappingCollectionConvention(IModelInspector inspector, PropertyPath member, ICollectionPropertiesMapper customizer) { if (inspector.IsManyToMany(member.LocalMember)) customizer.Table(member.ManyToManyIntermediateTableName()); customizer.Key(k => k.Column(DetermineKeyColumnName(inspector, member))); }
private void BeforeMappingCollectionConvention(IModelInspector inspector, PropertyPath member, ICollectionPropertiesMapper customizer) { if (inspector.IsManyToMany(member.LocalMember)) { customizer.Table(member.ManyToManyIntermediateTableName()); } customizer.Key(k => k.Column(DetermineKeyColumnName(inspector, member))); }
protected virtual new void BeforeMapSet(IModelInspector modelInspector, PropertyPath member, ISetPropertiesMapper propertyCustomizer) { if (modelInspector.IsManyToMany(member.LocalMember) == true) { propertyCustomizer.Key(x => x.Column(member.LocalMember.DeclaringType.Name + "_Id")); Type sourceType = member.LocalMember.DeclaringType; Type destinationType = member.LocalMember.GetPropertyOrFieldType().GetGenericArguments().First(); String [] names = new Type[] { sourceType, destinationType }.Select(x => x.Name).OrderBy(x => x).ToArray(); //set inverse on the relation of the alphabetically first entity name propertyCustomizer.Inverse(sourceType.Name == names.First()); //set mapping table name from the entity names in alphabetical order propertyCustomizer.Table(String.Join("_", names)); } }
/// <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.IsManyToMany(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); }); }
protected virtual void OnBeforeMappingCollectionConvention(IModelInspector modelinspector, PropertyPath member, ICollectionPropertiesMapper collectionPropertiesCustomizer) { if (modelinspector.IsManyToMany(member.LocalMember)) { collectionPropertiesCustomizer.Table(member.ManyToManyIntermediateTableName("To")); } if (modelinspector.IsSet(member.LocalMember)) { // If otherside has many-to-one, make it inverse, if not specify foreign key on Key element MemberInfo oneToManyProperty = member.OneToManyOtherSideProperty(); IEnumerable<MemberInfo> candidatesManyToOne = MembersProvider .GetRootEntityMembers(oneToManyProperty.DeclaringType) .Where(modelinspector.IsManyToOne); if (candidatesManyToOne.Any(mi => mi.MemberType() == member.LocalMember.DeclaringType)) { collectionPropertiesCustomizer.Inverse(true); } else { Contract.Assert(oneToManyProperty.DeclaringType != null, "otherSideProperty.DeclaringType != null"); collectionPropertiesCustomizer.Key(k => k.ForeignKey(string.Format("FK_{0}_{1}", oneToManyProperty.DeclaringType.Name, oneToManyProperty.Name))); } } collectionPropertiesCustomizer.Key(k => k.Column(GetKeyColumnName(modelinspector, member))); }
/// <summary> /// Sets the following conventions: /// 1) Foreign key fields are named as the property name suffixed by the value of _foreignKeyColumnSuffix. /// 2) Many to Many link tables are named as the object type names sorted alphabetically with the _manyToManyLinkTableInsert inserted inbetween them. /// </summary> private void BeforeMappingCollectionConvention(IModelInspector inspector, PropertyPath member, ICollectionPropertiesMapper customizer) { string tableName; if (inspector.IsManyToMany(member.LocalMember)) { tableName = GetManyToManyLinkTableName(member); customizer.Table(tableName); } else { tableName = member.GetCollectionElementType().Name; } string columnName = GetKeyColumnName(inspector, member); string foreignKeyName = string.Format("{0}{1}_{2}", _foreignKeyNamePrefix, tableName, columnName); customizer.Key(k => { k.Column(columnName); k.ForeignKey(foreignKeyName); }); }