Ejemplo n.º 1
0
                public virtual OneToOneBuilder ForeignKey <TDependentEntity>(
                    [NotNull] Expression <Func <TDependentEntity, object> > foreignKeyExpression)
                {
                    Check.NotNull(foreignKeyExpression, "foreignKeyExpression");

                    if (Builder.ModelBuilder.GetOrAddEntity(typeof(TDependentEntity)).Metadata != _builder.DependentType)
                    {
                        _builder.Invert();
                    }

                    return(new OneToOneBuilder(
                               Builder.OneToOneForeignKey(typeof(TDependentEntity), foreignKeyExpression.GetPropertyAccessList())));
                }
Ejemplo n.º 2
0
        public virtual InternalRelationshipBuilder Apply(InternalRelationshipBuilder relationshipBuilder)
        {
            var foreignKey = (IForeignKey)relationshipBuilder.Metadata;

            if (foreignKey.Properties.All(fk => fk.IsShadowProperty))
            {
                var foreignKeyProperties = FindCandidateForeignKeyProperties(relationshipBuilder, onDependent: true);

                if (foreignKey.IsUnique &&
                    !foreignKey.IsSelfPrimaryKeyReferencing())
                {
                    if (ShouldFlip(relationshipBuilder, foreignKeyProperties))
                    {
                        var newRelationshipBuilder = relationshipBuilder.Invert(ConfigurationSource.Convention);
                        if (newRelationshipBuilder != null)
                        {
                            return(newRelationshipBuilder);
                        }
                    }

                    if (foreignKeyProperties == null)
                    {
                        foreignKeyProperties = GetCompatiblePrimaryKeyProperties(
                            relationshipBuilder.Metadata.DeclaringEntityType, relationshipBuilder.Metadata.PrincipalKey.Properties);
                    }
                }

                if (foreignKeyProperties != null &&
                    relationshipBuilder.Metadata.DeclaringEntityType.FindForeignKey(foreignKeyProperties) == null)
                {
                    var newRelationshipBuilder = relationshipBuilder.ForeignKey(foreignKeyProperties, ConfigurationSource.Convention);
                    if (newRelationshipBuilder != null)
                    {
                        return(newRelationshipBuilder);
                    }
                }
            }

            return(relationshipBuilder);
        }
        public virtual InternalRelationshipBuilder Apply(InternalRelationshipBuilder relationshipBuilder)
        {
            var foreignKey = (IForeignKey)relationshipBuilder.Metadata;
            if (foreignKey.Properties.All(fk => fk.IsShadowProperty))
            {
                var foreignKeyProperties = FindCandidateForeignKeyProperties(relationshipBuilder, onDependent: true);

                if (foreignKey.IsUnique
                    && !foreignKey.IsSelfPrimaryKeyReferencing())
                {
                    if (ShouldFlip(relationshipBuilder, foreignKeyProperties))
                    {
                        var newRelationshipBuilder = relationshipBuilder.Invert(ConfigurationSource.Convention);
                        if (newRelationshipBuilder != null)
                        {
                            return newRelationshipBuilder;
                        }
                    }

                    if (foreignKeyProperties == null)
                    {
                        foreignKeyProperties = GetCompatiblePrimaryKeyProperties(
                            relationshipBuilder.Metadata.DeclaringEntityType, relationshipBuilder.Metadata.PrincipalKey.Properties);
                    }
                }

                if (foreignKeyProperties != null
                    && relationshipBuilder.Metadata.DeclaringEntityType.FindForeignKey(foreignKeyProperties) == null)
                {
                    var newRelationshipBuilder = relationshipBuilder.ForeignKey(foreignKeyProperties, ConfigurationSource.Convention);
                    if (newRelationshipBuilder != null)
                    {
                        return newRelationshipBuilder;
                    }
                }
            }

            return relationshipBuilder;
        }
Ejemplo n.º 4
0
        public virtual InternalRelationshipBuilder Apply(InternalRelationshipBuilder relationshipBuilder)
        {
            Check.NotNull(relationshipBuilder, nameof(relationshipBuilder));

            var foreignKey = relationshipBuilder.Metadata;

            var fkPropertyOnPrincipal = FindForeignKeyAttributeOnProperty(foreignKey.PrincipalEntityType, foreignKey.PrincipalToDependent?.Name);
            var fkPropertyOnDependent = FindForeignKeyAttributeOnProperty(foreignKey.DeclaringEntityType, foreignKey.DependentToPrincipal?.Name);

            if (!string.IsNullOrEmpty(fkPropertyOnDependent) &&
                !string.IsNullOrEmpty(fkPropertyOnPrincipal))
            {
                // TODO: Log Error that unable to determine principal end based on foreign key attributes on properties
                SplitNavigationsInSeparateRelationships(relationshipBuilder);

                return(null);
            }

            var fkPropertiesOnPrincipalToDependent = FindCandidateDependentPropertiesThroughNavigation(relationshipBuilder, pointsToPrincipal: false);
            var fkPropertiesOnDependentToPrincipal = FindCandidateDependentPropertiesThroughNavigation(relationshipBuilder, pointsToPrincipal: true);

            if (fkPropertiesOnDependentToPrincipal != null &&
                fkPropertiesOnPrincipalToDependent != null &&
                !fkPropertiesOnDependentToPrincipal.SequenceEqual(fkPropertiesOnPrincipalToDependent))
            {
                // TODO: Log error that foreign key properties on both navigations do not match
                SplitNavigationsInSeparateRelationships(relationshipBuilder);

                return(null);
            }

            var fkPropertiesOnNavigation = fkPropertiesOnDependentToPrincipal ?? fkPropertiesOnPrincipalToDependent;

            InternalRelationshipBuilder newRelationshipBuilder = null;

            if (fkPropertiesOnNavigation == null || fkPropertiesOnNavigation.Count == 0)
            {
                if (fkPropertyOnDependent == null && fkPropertyOnPrincipal == null)
                {
                    return(relationshipBuilder);
                }
                if (fkPropertyOnDependent != null)
                {
                    newRelationshipBuilder = relationshipBuilder.ForeignKey(new List <string> {
                        fkPropertyOnDependent
                    }, ConfigurationSource.DataAnnotation);
                }
                else
                {
                    newRelationshipBuilder = relationshipBuilder.Invert(ConfigurationSource.DataAnnotation)
                                             ?.ForeignKey(new List <string> {
                        fkPropertyOnPrincipal
                    }, ConfigurationSource.DataAnnotation);
                }
            }
            else
            {
                if (fkPropertyOnDependent == null && fkPropertyOnPrincipal == null)
                {
                    if (fkPropertiesOnNavigation.All(p => foreignKey.DeclaringEntityType.FindProperty(p) != null) ||
                        fkPropertiesOnNavigation.Any(p => foreignKey.PrincipalEntityType.FindProperty(p) == null))
                    {
                        newRelationshipBuilder = relationshipBuilder.ForeignKey(fkPropertiesOnNavigation, ConfigurationSource.DataAnnotation);
                    }
                    else
                    {
                        newRelationshipBuilder = relationshipBuilder.Invert(ConfigurationSource.DataAnnotation)
                                                 ?.ForeignKey(fkPropertiesOnNavigation, ConfigurationSource.DataAnnotation);
                    }
                }
                else
                {
                    if (fkPropertiesOnNavigation.Count != 1 ||
                        !string.Equals(fkPropertiesOnNavigation.First(), fkPropertyOnDependent ?? fkPropertyOnPrincipal))
                    {
                        // TODO: Log error that mismatch in foreignKey Attribute on navigation and property
                        SplitNavigationsInSeparateRelationships(relationshipBuilder);

                        return(null);
                    }

                    if (fkPropertyOnDependent != null)
                    {
                        newRelationshipBuilder = relationshipBuilder.ForeignKey(fkPropertiesOnNavigation, ConfigurationSource.DataAnnotation);
                    }
                    else
                    {
                        newRelationshipBuilder = relationshipBuilder.Invert(ConfigurationSource.DataAnnotation)
                                                 ?.ForeignKey(fkPropertiesOnNavigation, ConfigurationSource.DataAnnotation);
                    }
                }
            }
            return(newRelationshipBuilder ?? relationshipBuilder);
        }
        public virtual InternalRelationshipBuilder Apply(InternalRelationshipBuilder relationshipBuilder)
        {
            Check.NotNull(relationshipBuilder, nameof(relationshipBuilder));

            var foreignKey = relationshipBuilder.Metadata;

            var fkPropertyOnPrincipal = FindCandidateDependentPropertyThroughEntityType(foreignKey.PrincipalEntityType, foreignKey.PrincipalToDependent?.Name);
            var fkPropertyOnDependent = FindCandidateDependentPropertyThroughEntityType(foreignKey.DeclaringEntityType, foreignKey.DependentToPrincipal?.Name);

            if (!string.IsNullOrEmpty(fkPropertyOnDependent)
                && !string.IsNullOrEmpty(fkPropertyOnPrincipal))
            {
                // TODO: Log Error that unable to determine principal end based on foreign key attributes
                var principalTypeNavigationName = foreignKey.PrincipalToDependent?.Name;
                var dependentTypeNavigationName = foreignKey.DependentToPrincipal?.Name;

                var dependentEntityTypebuilder = relationshipBuilder.ModelBuilder.Entity(foreignKey.DeclaringEntityType.Name, ConfigurationSource.Convention);
                var removedConfigurationSource = dependentEntityTypebuilder.RemoveRelationship(foreignKey, ConfigurationSource.DataAnnotation);

                if (removedConfigurationSource == null)
                {
                    return relationshipBuilder;
                }

                var principalEntityTypeBuilder = relationshipBuilder.ModelBuilder.Entity(foreignKey.PrincipalEntityType.Name, ConfigurationSource.Convention);

                dependentEntityTypebuilder.Relationship(
                    principalEntityTypeBuilder,
                    dependentEntityTypebuilder,
                    navigationToPrincipalName: dependentTypeNavigationName,
                    navigationToDependentName: null,
                    configurationSource: ConfigurationSource.DataAnnotation);

                principalEntityTypeBuilder.Relationship(
                    dependentEntityTypebuilder,
                    principalEntityTypeBuilder,
                    navigationToPrincipalName: principalTypeNavigationName,
                    navigationToDependentName: null,
                    configurationSource: ConfigurationSource.DataAnnotation);

                return null;
            }

            var fkPropertiesOnPrincipalToDependent = FindCandidateDependentPropertiesThroughNavigation(relationshipBuilder, pointsToPrincipal: false);
            var fkPropertiesOnDependentToPrincipal = FindCandidateDependentPropertiesThroughNavigation(relationshipBuilder, pointsToPrincipal: true);

            if (fkPropertiesOnDependentToPrincipal != null
                && fkPropertiesOnPrincipalToDependent != null
                && !fkPropertiesOnDependentToPrincipal.SequenceEqual(fkPropertiesOnPrincipalToDependent))
            {
                // TODO: Log error that mismatch in foreignKey Attribute on both navigations
                return relationshipBuilder;
            }

            var fkPropertiesOnNavigation = fkPropertiesOnDependentToPrincipal ?? fkPropertiesOnPrincipalToDependent;

            InternalRelationshipBuilder newRelationshipBuilder = null;
            if (fkPropertiesOnNavigation == null || fkPropertiesOnNavigation.Count == 0)
            {
                if (fkPropertyOnDependent == null && fkPropertyOnPrincipal == null)
                {
                    return relationshipBuilder;
                }
                if (fkPropertyOnDependent != null)
                {
                    newRelationshipBuilder = relationshipBuilder.ForeignKey(new List<string> { fkPropertyOnDependent }, ConfigurationSource.DataAnnotation);
                }
                else
                {
                    newRelationshipBuilder = relationshipBuilder.Invert(ConfigurationSource.DataAnnotation)
                        ?.ForeignKey(new List<string> { fkPropertyOnPrincipal }, ConfigurationSource.DataAnnotation);
                }
            }
            else
            {
                if (fkPropertyOnDependent == null && fkPropertyOnPrincipal == null)
                {
                    if (fkPropertiesOnNavigation.All(p => foreignKey.DeclaringEntityType.FindProperty(p) != null)
                        || fkPropertiesOnNavigation.Any(p => foreignKey.PrincipalEntityType.FindProperty(p) == null))
                    {
                        newRelationshipBuilder = relationshipBuilder.ForeignKey(fkPropertiesOnNavigation, ConfigurationSource.DataAnnotation);
                    }
                    else
                    {
                        newRelationshipBuilder = relationshipBuilder.Invert(ConfigurationSource.DataAnnotation)
                            ?.ForeignKey(fkPropertiesOnNavigation, ConfigurationSource.DataAnnotation);
                    }
                }
                else
                {
                    if (fkPropertiesOnNavigation.Count != 1
                        || !string.Equals(fkPropertiesOnNavigation.First(), fkPropertyOnDependent ?? fkPropertyOnPrincipal))
                    {
                        // TODO: Log error that mismatch in foreignKey Attribute on navigation and property
                        return relationshipBuilder;
                    }
                    if (fkPropertyOnDependent != null)
                    {
                        newRelationshipBuilder = relationshipBuilder.ForeignKey(fkPropertiesOnNavigation, ConfigurationSource.DataAnnotation);
                    }
                    else
                    {
                        newRelationshipBuilder = relationshipBuilder.Invert(ConfigurationSource.DataAnnotation)
                            ?.ForeignKey(fkPropertiesOnNavigation, ConfigurationSource.DataAnnotation);
                    }
                }
            }
            return newRelationshipBuilder ?? relationshipBuilder;
        }
        public virtual InternalRelationshipBuilder Apply(InternalRelationshipBuilder relationshipBuilder)
        {
            var foreignKey = (IForeignKey)relationshipBuilder.Metadata;
            if (!foreignKey.Properties.All(fk => fk.IsShadowProperty))
            {
                return relationshipBuilder;
            }

            var foreignKeyProperties = FindCandidateForeignKeyProperties(
                relationshipBuilder.Metadata, onDependent: true);
            if (foreignKey.IsUnique
                && !foreignKey.IsSelfPrimaryKeyReferencing())
            {
                var candidatePropertiesOnPrincipal = FindCandidateForeignKeyProperties(
                    relationshipBuilder.Metadata, onDependent: false);

                bool shouldInvert;
                if (ShouldFlip(relationshipBuilder.Metadata, foreignKeyProperties, candidatePropertiesOnPrincipal)
                    && relationshipBuilder.CanSet(relationshipBuilder.Metadata.DeclaringEntityType,
                        relationshipBuilder.Metadata.PrincipalEntityType,
                        null,
                        null,
                        /*dependentProperties:*/ candidatePropertiesOnPrincipal,
                        null,
                        null,
                        null,
                        null,
                        true,
                        ConfigurationSource.Convention,
                        out shouldInvert))
                {
                    Debug.Assert(shouldInvert);
                    var invertedBuilder = relationshipBuilder.Invert(ConfigurationSource.Convention);
                    Debug.Assert(invertedBuilder != null);

                    if (candidatePropertiesOnPrincipal == null)
                    {
                        return invertedBuilder;
                    }

                    // TODO: Remove, as this is redundant
                    invertedBuilder = invertedBuilder.ForeignKey(
                        candidatePropertiesOnPrincipal, ConfigurationSource.Convention);
                    Debug.Assert(invertedBuilder != null);
                    return invertedBuilder;
                }

                if (foreignKeyProperties == null)
                {
                    foreignKeyProperties = GetCompatiblePrimaryKeyProperties(
                        relationshipBuilder.Metadata.DeclaringEntityType,
                        relationshipBuilder.Metadata.PrincipalEntityType,
                        relationshipBuilder.Metadata.PrincipalKey.Properties);
                }
            }

            if (foreignKeyProperties != null
                && relationshipBuilder.Metadata.DeclaringEntityType.FindForeignKey(foreignKeyProperties) == null)
            {
                var newRelationshipBuilder = relationshipBuilder.ForeignKey(foreignKeyProperties, ConfigurationSource.Convention);
                if (newRelationshipBuilder != null)
                {
                    return newRelationshipBuilder;
                }
            }

            return relationshipBuilder;
        }
        public virtual InternalRelationshipBuilder Apply(InternalRelationshipBuilder relationshipBuilder)
        {
            var foreignKey = (IForeignKey)relationshipBuilder.Metadata;

            if (!foreignKey.Properties.All(fk => fk.IsShadowProperty))
            {
                return(relationshipBuilder);
            }

            var foreignKeyProperties = FindCandidateForeignKeyProperties(
                relationshipBuilder.Metadata, onDependent: true);

            if (foreignKey.IsUnique &&
                !foreignKey.IsSelfPrimaryKeyReferencing())
            {
                var candidatePropertiesOnPrincipal = FindCandidateForeignKeyProperties(
                    relationshipBuilder.Metadata, onDependent: false);

                bool shouldInvert;
                if (ShouldFlip(relationshipBuilder.Metadata, foreignKeyProperties, candidatePropertiesOnPrincipal) &&
                    relationshipBuilder.CanSet(relationshipBuilder.Metadata.DeclaringEntityType,
                                               relationshipBuilder.Metadata.PrincipalEntityType,
                                               null,
                                               null,
                                               /*dependentProperties:*/ candidatePropertiesOnPrincipal,
                                               null,
                                               null,
                                               null,
                                               null,
                                               true,
                                               ConfigurationSource.Convention,
                                               out shouldInvert))
                {
                    Debug.Assert(shouldInvert);
                    var invertedBuilder = relationshipBuilder.Invert(ConfigurationSource.Convention);
                    Debug.Assert(invertedBuilder != null);

                    if (candidatePropertiesOnPrincipal == null)
                    {
                        return(invertedBuilder);
                    }

                    // TODO: Remove, as this is redundant
                    invertedBuilder = invertedBuilder.ForeignKey(
                        candidatePropertiesOnPrincipal, ConfigurationSource.Convention);
                    Debug.Assert(invertedBuilder != null);
                    return(invertedBuilder);
                }

                if (foreignKeyProperties == null)
                {
                    foreignKeyProperties = GetCompatiblePrimaryKeyProperties(
                        relationshipBuilder.Metadata.DeclaringEntityType,
                        relationshipBuilder.Metadata.PrincipalEntityType,
                        relationshipBuilder.Metadata.PrincipalKey.Properties);
                }
            }

            if (foreignKeyProperties != null &&
                relationshipBuilder.Metadata.DeclaringEntityType.FindForeignKey(foreignKeyProperties) == null)
            {
                var newRelationshipBuilder = relationshipBuilder.ForeignKey(foreignKeyProperties, ConfigurationSource.Convention);
                if (newRelationshipBuilder != null)
                {
                    return(newRelationshipBuilder);
                }
            }

            return(relationshipBuilder);
        }