Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
            }
        }
Ejemplo n.º 3
0
        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) &&