private void Process( IConventionEntityTypeBuilder entityTypeBuilder, MemberInfo navigationMemberInfo, Type targetClrType, InversePropertyAttribute attribute) { var entityType = (EntityType)entityTypeBuilder.Metadata; var navigationName = navigationMemberInfo.GetSimpleMemberName(); if (entityTypeBuilder.IsIgnored(navigationName, fromDataAnnotation: true) || entityType.FindPropertiesInHierarchy(navigationName).Cast <IConventionPropertyBase>() .Concat(entityType.FindServicePropertiesInHierarchy(navigationName)) .Any(m => !ConfigurationSource.DataAnnotation.Overrides(m.GetConfigurationSource()))) { return; } var targetEntityTypeBuilder = ((InternalEntityTypeBuilder)entityTypeBuilder).GetTargetEntityTypeBuilder( targetClrType, navigationMemberInfo, ConfigurationSource.DataAnnotation); if (targetEntityTypeBuilder == null) { return; } ConfigureInverseNavigation(entityTypeBuilder, navigationMemberInfo, targetEntityTypeBuilder, attribute); }
private void Process(IConventionEntityTypeBuilder entityTypeBuilder) { var entityType = entityTypeBuilder.Metadata; var candidates = entityType.GetRuntimeProperties().Values; foreach (var propertyInfo in candidates) { var name = propertyInfo.GetSimpleMemberName(); if (entityTypeBuilder.IsIgnored(name) || entityType.FindProperty(propertyInfo) != null || entityType.FindNavigation(propertyInfo) != null || !propertyInfo.IsCandidateProperty(publicOnly: false) || (propertyInfo.IsCandidateProperty() && Dependencies.TypeMappingSource.FindMapping(propertyInfo) != null)) { continue; } var factory = Dependencies.ParameterBindingFactories.FindFactory(propertyInfo.PropertyType, name); if (factory == null) { continue; } entityTypeBuilder.ServiceProperty(propertyInfo)?.HasParameterBinding( (ServiceParameterBinding)factory.Bind(entityType, propertyInfo.PropertyType, name)); } }
private void Process(IConventionEntityTypeBuilder entityTypeBuilder) { var entityType = entityTypeBuilder.Metadata; if (!entityType.HasClrType()) { return; } var candidates = entityType.GetRuntimeProperties().Values; foreach (var propertyInfo in candidates) { var name = propertyInfo.GetSimpleMemberName(); if (entityTypeBuilder.IsIgnored(name) || entityType.FindProperty(propertyInfo) != null || entityType.FindNavigation(propertyInfo) != null || !propertyInfo.IsCandidateProperty(publicOnly: false) || (propertyInfo.IsCandidateProperty() && Dependencies.TypeMappingSource.FindMapping(propertyInfo) != null)) { continue; } var factory = Dependencies.ParameterBindingFactories.FindFactory(propertyInfo.PropertyType, name); if (factory == null) { continue; } var duplicateMap = GetDuplicateServiceProperties(entityType); if (duplicateMap != null && duplicateMap.TryGetValue(propertyInfo.PropertyType, out var duplicateServiceProperties)) { duplicateServiceProperties.Add(propertyInfo); return; } var otherServicePropertySameType = entityType.GetServiceProperties() .FirstOrDefault(p => p.ClrType == propertyInfo.PropertyType); if (otherServicePropertySameType != null) { if (ConfigurationSource.Convention.Overrides(otherServicePropertySameType.GetConfigurationSource())) { otherServicePropertySameType.DeclaringEntityType.RemoveServiceProperty(otherServicePropertySameType.Name); } AddDuplicateServiceProperty(entityTypeBuilder, propertyInfo); AddDuplicateServiceProperty(entityTypeBuilder, otherServicePropertySameType.GetIdentifyingMemberInfo()); return; } entityTypeBuilder.ServiceProperty(propertyInfo)?.HasParameterBinding( (ServiceParameterBinding)factory.Bind(entityType, propertyInfo.PropertyType, propertyInfo.GetSimpleMemberName())); } }
private static bool IsCandidateNavigationProperty( IConventionEntityTypeBuilder?sourceEntityTypeBuilder, string navigationName, MemberInfo?memberInfo) => memberInfo != null && sourceEntityTypeBuilder?.IsIgnored(navigationName) == false && sourceEntityTypeBuilder.Metadata.FindProperty(navigationName) == null && sourceEntityTypeBuilder.Metadata.FindServiceProperty(navigationName) == null && (!(memberInfo is PropertyInfo propertyInfo) || propertyInfo.GetIndexParameters().Length == 0) &&