public static IReadOnlyEntityType ResolveEntityTypeInHierarchy( this IReadOnlyForeignKey foreignKey, IReadOnlyEntityType entityType) { if (!foreignKey.DeclaringEntityType.IsAssignableFrom(entityType) && !foreignKey.PrincipalEntityType.IsAssignableFrom(entityType)) { throw new InvalidOperationException( CoreStrings.EntityTypeNotInRelationship( entityType.DisplayName(), foreignKey.DeclaringEntityType.DisplayName(), foreignKey.PrincipalEntityType.DisplayName())); } if (foreignKey.DeclaringEntityType.IsAssignableFrom(foreignKey.PrincipalEntityType) || foreignKey.PrincipalEntityType.IsAssignableFrom(foreignKey.DeclaringEntityType)) { throw new InvalidOperationException( CoreStrings.IntraHierarchicalAmbiguousTargetEntityType( entityType.DisplayName(), foreignKey.Properties.Format(), foreignKey.PrincipalEntityType.DisplayName(), foreignKey.DeclaringEntityType.DisplayName())); } return(foreignKey.DeclaringEntityType.IsAssignableFrom(entityType) ? foreignKey.DeclaringEntityType : foreignKey.PrincipalEntityType); }
public static MemberInfo GetNavigationMemberInfo( [NotNull] this IReadOnlyEntityType entityType, [NotNull] string navigationName) { var memberInfo = entityType.ClrType.GetMembersInHierarchy(navigationName).FirstOrDefault(); if (memberInfo == null) { throw new InvalidOperationException( CoreStrings.NoClrNavigation(navigationName, entityType.DisplayName())); } return(memberInfo); }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public static IEnumerable <IReadOnlyNavigation> FindNavigationsTo( this IReadOnlyForeignKey foreignKey, IReadOnlyEntityType entityType) { if (foreignKey.DeclaringEntityType != entityType && foreignKey.PrincipalEntityType != entityType) { throw new InvalidOperationException( CoreStrings.EntityTypeNotInRelationshipStrict( entityType.DisplayName(), foreignKey.DeclaringEntityType.DisplayName(), foreignKey.PrincipalEntityType.DisplayName())); } return(foreignKey.IsSelfReferencing() ? foreignKey.GetNavigations() : foreignKey.FindNavigations(foreignKey.PrincipalEntityType == entityType)); }
public static IReadOnlyEntityType GetRelatedEntityType( [NotNull] this IReadOnlyForeignKey foreignKey, [NotNull] IReadOnlyEntityType entityType) { if (foreignKey.DeclaringEntityType != entityType && foreignKey.PrincipalEntityType != entityType) { throw new InvalidOperationException( CoreStrings.EntityTypeNotInRelationshipStrict( entityType.DisplayName(), foreignKey.DeclaringEntityType.DisplayName(), foreignKey.PrincipalEntityType.DisplayName())); } return(foreignKey.DeclaringEntityType == entityType ? foreignKey.PrincipalEntityType : foreignKey.DeclaringEntityType); }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public static IEnumerable <IReadOnlyNavigation> FindNavigationsToInHierarchy( this IReadOnlyForeignKey foreignKey, IReadOnlyEntityType entityType) { if (!foreignKey.DeclaringEntityType.IsAssignableFrom(entityType) && !foreignKey.PrincipalEntityType.IsAssignableFrom(entityType)) { throw new InvalidOperationException( CoreStrings.EntityTypeNotInRelationship( entityType.DisplayName(), foreignKey.DeclaringEntityType.DisplayName(), foreignKey.PrincipalEntityType.DisplayName())); } return(foreignKey.DeclaringEntityType.IsAssignableFrom(foreignKey.PrincipalEntityType) || foreignKey.PrincipalEntityType.IsAssignableFrom(foreignKey.DeclaringEntityType) ? foreignKey.GetNavigations() : foreignKey.FindNavigations(foreignKey.PrincipalEntityType.IsAssignableFrom(entityType))); }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public static MemberInfo GetNavigationMemberInfo( this IReadOnlyEntityType entityType, string navigationName) { MemberInfo?memberInfo; if (entityType.IsPropertyBag) { memberInfo = entityType.FindIndexerPropertyInfo() !; } else { memberInfo = entityType.ClrType.GetMembersInHierarchy(navigationName).FirstOrDefault(); if (memberInfo == null) { throw new InvalidOperationException( CoreStrings.NoClrNavigation(navigationName, entityType.DisplayName())); } } return(memberInfo); }