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 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); } }
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 static void InverseIfBidirectional(IModelInspector modelinspector, PropertyPath member, ICollectionPropertiesMapper propertycustomizer) { propertycustomizer.Inverse(BidirectionAssociation.AnalyzeManyToOne(member).Inverse); }