protected virtual InternalRelationshipBuilder WithManyBuilder([CanBeNull] string navigationName) => WithManyBuilder(MemberIdentity.Create(navigationName));
protected virtual InternalRelationshipBuilder WithManyBuilder([CanBeNull] MemberInfo navigationMemberInfo) => WithManyBuilder(MemberIdentity.Create(navigationMemberInfo));
public async Task <IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return(Page()); } DateTime now = DateTime.Now; var address = new Address { AddressType = Enrolment.AddressType, Address1 = Enrolment.Address1, Address2 = Enrolment.Address2, Address3 = Enrolment.Address3, City = Enrolment.City, County = Enrolment.County, CountryCode = Enrolment.CountryCode, PostCode = Enrolment.PostCode, WhenCreated = now }; var phoneNumber = new PhoneNumber { Phone = Enrolment.Phone, AddressType = Enrolment.AddressType, WhenCreated = now }; var emailAddress = new EmailAddress { Email = Enrolment.Email, AddressType = Enrolment.AddressType, WhenCreated = now }; var memberIdentity = new MemberIdentity { Title = Enrolment.Title, FirstName = Enrolment.FirstName, LastName = Enrolment.LastName, Addresses = new List <Address> { address }, EmailAddresses = new List <EmailAddress> { emailAddress }, PhoneNumbers = new List <PhoneNumber> { phoneNumber }, WhenCreated = now }; var account = new Account { AccountState = AccountState.Active, AccountType = Enrolment.AddressType, Name = Enrolment.Title + " " + Enrolment.FirstName + " " + Enrolment.LastName, CurrencyId = 1, Allocated = 0, WhenCreated = now }; var member = new Member { MemberIdentitys = new List <MemberIdentity> { memberIdentity }, Accounts = new List <Account> { account }, WhenCreated = now }; _context.Member.Add(member); await _context.SaveChangesAsync(); var memberId = member.Id; return(RedirectToPage("Members/Details/" + memberId)); }
/// <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 MemberIdentity CreateMemberIdentity(this IReadOnlySkipNavigation?navigation) => navigation?.GetIdentifyingMemberInfo() == null ? MemberIdentity.Create(navigation?.Name) : MemberIdentity.Create(navigation.GetIdentifyingMemberInfo());
protected virtual IMutableSkipNavigation WithRightManyNavigation([NotNull] MemberInfo navigationMemberInfo, [NotNull] string inverseName) => WithRightManyNavigation(MemberIdentity.Create(navigationMemberInfo), inverseName);
protected virtual InternalForeignKeyBuilder WithOneBuilder([CanBeNull] string navigationName) => WithOneBuilder(MemberIdentity.Create(navigationName));
/// <summary> /// The Register. /// </summary> /// <param name="memberIdentity">The memberIdentity<see cref="MemberIdentity"/>.</param> /// <param name="encoded">The encoded<see cref="bool"/>.</param> /// <returns>The <see cref="bool"/>.</returns> public abstract bool Register(MemberIdentity memberIdentity, bool encoded = false);
/// <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 virtual Expression BindMember( [NotNull] MemberInfo memberInfo, [NotNull] Type entityType, bool clientEval, [NotNull] out IPropertyBase propertyBase) => BindMember(MemberIdentity.Create(memberInfo), entityType, clientEval, out propertyBase);
/// <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> protected override Expression VisitMember(MemberExpression memberExpression) => TryBindMember(memberExpression.Expression, MemberIdentity.Create(memberExpression.Member), out var result) ? result : TranslationFailed(memberExpression.Expression, Visit(memberExpression.Expression), out var sqlInnerExpression) ? null : _memberTranslatorProvider.Translate(sqlInnerExpression, memberExpression.Member, memberExpression.Type);
private Expression Expand(Expression source, MemberIdentity member) { Type convertedType = null; if (source is UnaryExpression unaryExpression && unaryExpression.NodeType == ExpressionType.Convert) { source = unaryExpression.Operand; if (unaryExpression.Type != typeof(object)) { convertedType = unaryExpression.Type; } } if (source is EntityShaperExpression entityShaperExpression) { var entityType = entityShaperExpression.EntityType; if (convertedType != null) { entityType = entityType.RootType().GetDerivedTypesInclusive() .FirstOrDefault(et => et.ClrType == convertedType); if (entityType == null) { return(null); } } var navigation = member.MemberInfo != null ? entityType.FindNavigation(member.MemberInfo) : entityType.FindNavigation(member.Name); if (navigation != null && navigation.ForeignKey.IsOwnership) { if (navigation.IsCollection()) { return(CreateShapedQueryExpression( navigation.GetTargetType(), _sqlExpressionFactory.Select(navigation.GetTargetType()))); } var entityProjectionExpression = (EntityProjectionExpression) (entityShaperExpression.ValueBufferExpression is ProjectionBindingExpression projectionBindingExpression ? _selectExpression.GetMappedProjection(projectionBindingExpression.ProjectionMember) : entityShaperExpression.ValueBufferExpression); var innerShaper = entityProjectionExpression.BindNavigation(navigation); if (innerShaper == null) { var targetEntityType = navigation.GetTargetType(); var innerSelectExpression = _sqlExpressionFactory.Select(targetEntityType); var innerShapedQuery = CreateShapedQueryExpression(targetEntityType, innerSelectExpression); var makeNullable = navigation.ForeignKey.PrincipalKey.Properties .Concat(navigation.ForeignKey.Properties) .Select(p => p.ClrType) .Any(t => t.IsNullableType()); var outerKey = CreateKeyAccessExpression( entityShaperExpression, navigation.ForeignKey.PrincipalKey.Properties, makeNullable); var innerKey = CreateKeyAccessExpression( innerShapedQuery.ShaperExpression, navigation.ForeignKey.Properties, makeNullable); var joinPredicate = _sqlTranslator.Translate(Expression.Equal(outerKey, innerKey)); _selectExpression.AddLeftJoin(innerSelectExpression, joinPredicate, null); var leftJoinTable = ((LeftJoinExpression)_selectExpression.Tables.Last()).Table; innerShaper = new EntityShaperExpression(targetEntityType, new EntityProjectionExpression(targetEntityType, leftJoinTable, true), true); entityProjectionExpression.AddNavigationBinding(navigation, innerShaper); } return(innerShaper); } } return(null); }
/// <summary> /// Creates a new <see cref="MemberIdentity" /> for the given navigation property. /// </summary> /// <param name="navigation"> The navigation property. </param> /// <returns> The new <see cref="MemberIdentity" />. </returns> public static MemberIdentity CreateMemberIdentity([CanBeNull] this INavigation navigation) => navigation?.GetIdentifyingMemberInfo() == null ? MemberIdentity.Create(navigation?.Name) : MemberIdentity.Create(navigation.GetIdentifyingMemberInfo());
private InternalForeignKeyBuilder WithOneBuilder(MemberIdentity reference) { if (SkipNavigation != null) { // Note: we delayed setting the ConfigurationSource of SkipNavigation in HasMany() // so we can test it here and override if the skip navigation was originally found // by convention. if (((IConventionSkipNavigation)SkipNavigation).GetConfigurationSource() == ConfigurationSource.Explicit) { throw new InvalidOperationException( CoreStrings.ConflictingRelationshipNavigation( SkipNavigation.DeclaringEntityType.DisplayName() + "." + SkipNavigation.Name, RelatedEntityType.DisplayName() + (reference.Name == null ? "" : "." + reference.Name), SkipNavigation.DeclaringEntityType.DisplayName() + "." + SkipNavigation.Name, SkipNavigation.TargetEntityType.DisplayName() + (SkipNavigation.Inverse == null ? "" : "." + SkipNavigation.Inverse.Name))); } var navigationName = SkipNavigation.Name; var declaringEntityType = (EntityType)DeclaringEntityType; if (SkipNavigation.Inverse != null) { ((EntityType)SkipNavigation.Inverse.DeclaringEntityType).Builder.HasNoSkipNavigation( (SkipNavigation)SkipNavigation.Inverse, ConfigurationSource.Explicit); } declaringEntityType.Builder.HasNoSkipNavigation((SkipNavigation)SkipNavigation, ConfigurationSource.Explicit); Builder = declaringEntityType.Builder .HasRelationship( (EntityType)RelatedEntityType, navigationName, ConfigurationSource.Explicit, targetIsPrincipal: false); SkipNavigation = null; } var foreignKey = Builder.Metadata; var referenceName = reference.Name; if (referenceName != null && foreignKey.DependentToPrincipal != null && foreignKey.GetDependentToPrincipalConfigurationSource() == ConfigurationSource.Explicit && foreignKey.DependentToPrincipal.Name != referenceName) { InternalForeignKeyBuilder.ThrowForConflictingNavigation(foreignKey, referenceName, newToPrincipal: true); } return(reference.MemberInfo == null || CollectionMember == null ? Builder.HasNavigations( reference.Name, CollectionName, (EntityType)DeclaringEntityType, (EntityType)RelatedEntityType, ConfigurationSource.Explicit) : Builder.HasNavigations( reference.MemberInfo, CollectionMember, (EntityType)DeclaringEntityType, (EntityType)RelatedEntityType, ConfigurationSource.Explicit)); }
private OwnedNavigationBuilder <TDependentEntity, TNewRelatedEntity> OwnsManyBuilder <TNewRelatedEntity>(MemberIdentity navigation) where TNewRelatedEntity : class { InternalForeignKeyBuilder relationship; using (var batch = DependentEntityType.Model.ConventionDispatcher.DelayConventions()) { relationship = DependentEntityType.Builder.HasOwnership(typeof(TNewRelatedEntity), navigation, ConfigurationSource.Explicit); relationship.IsUnique(false, ConfigurationSource.Explicit); relationship = (InternalForeignKeyBuilder)batch.Run(relationship.Metadata).Builder; } return(new OwnedNavigationBuilder <TDependentEntity, TNewRelatedEntity>( DependentEntityType, relationship.Metadata.DeclaringEntityType, relationship)); }
private InternalRelationshipBuilder WithOneBuilder(MemberIdentity reference) { var referenceName = reference.Name; if (!Builder.Metadata.IsUnique && Builder.Metadata.PrincipalToDependent != null && Builder.Metadata.GetPrincipalToDependentConfigurationSource() == ConfigurationSource.Explicit && referenceName != null) { ThrowForConflictingNavigation(Builder.Metadata, referenceName, false); } using var batch = Builder.Metadata.DeclaringEntityType.Model.ConventionDispatcher.DelayConventions(); var builder = Builder.IsUnique(true, ConfigurationSource.Explicit); var foreignKey = builder.Metadata; if (foreignKey.IsSelfReferencing() && referenceName != null && ReferenceName == referenceName) { throw new InvalidOperationException( CoreStrings.ConflictingPropertyOrNavigation( referenceName, RelatedEntityType.DisplayName(), RelatedEntityType.DisplayName())); } var pointsToPrincipal = !foreignKey.IsSelfReferencing() && (!foreignKey.DeclaringEntityType.IsAssignableFrom(DeclaringEntityType) || !foreignKey.PrincipalEntityType.IsAssignableFrom(RelatedEntityType) || (foreignKey.DeclaringEntityType.IsAssignableFrom(RelatedEntityType) && foreignKey.PrincipalEntityType.IsAssignableFrom(DeclaringEntityType) && foreignKey.PrincipalToDependent != null && foreignKey.PrincipalToDependent.Name == ReferenceName)); if (referenceName != null && ((pointsToPrincipal && foreignKey.DependentToPrincipal != null && foreignKey.GetDependentToPrincipalConfigurationSource() == ConfigurationSource.Explicit && foreignKey.DependentToPrincipal.Name != referenceName) || (!pointsToPrincipal && foreignKey.PrincipalToDependent != null && foreignKey.GetPrincipalToDependentConfigurationSource() == ConfigurationSource.Explicit && foreignKey.PrincipalToDependent.Name != referenceName))) { ThrowForConflictingNavigation(foreignKey, referenceName, pointsToPrincipal); } var referenceProperty = reference.MemberInfo; if (pointsToPrincipal) { builder = referenceProperty == null || ReferenceMember == null ? builder.HasNavigations( referenceName, ReferenceName, (EntityType)DeclaringEntityType, (EntityType)RelatedEntityType, ConfigurationSource.Explicit) : builder.HasNavigations( referenceProperty, ReferenceMember, (EntityType)DeclaringEntityType, (EntityType)RelatedEntityType, ConfigurationSource.Explicit); } else { builder = referenceProperty == null || ReferenceMember == null ? builder.HasNavigations( ReferenceName, referenceName, (EntityType)RelatedEntityType, (EntityType)DeclaringEntityType, ConfigurationSource.Explicit) : builder.HasNavigations( ReferenceMember, referenceProperty, (EntityType)RelatedEntityType, (EntityType)DeclaringEntityType, ConfigurationSource.Explicit); } return(batch.Run(builder)); }
/// <summary> /// The Register. /// </summary> /// <param name="name">The name<see cref="string"/>.</param> /// <param name="key">The key<see cref="string"/>.</param> /// <param name="di">The di<see cref="MemberIdentity"/>.</param> /// <param name="ip">The ip<see cref="string"/>.</param> /// <returns>The <see cref="bool"/>.</returns> public abstract bool Register(string name, string key, out MemberIdentity di, string ip = "");
/// <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 virtual Expression BindMember( [NotNull] string name, [NotNull] Type entityType, bool clientEval, [NotNull] out IPropertyBase propertyBase) => BindMember(MemberIdentity.Create(name), entityType, clientEval, out propertyBase);
/// <summary> /// The Register. /// </summary> /// <param name="token">The token<see cref="string"/>.</param> /// <param name="di">The di<see cref="MemberIdentity"/>.</param> /// <param name="ip">The ip<see cref="string"/>.</param> /// <returns>The <see cref="bool"/>.</returns> public abstract bool Register(string token, out MemberIdentity di, string ip = "");
private static IProperty GetProperty(IEntityType entityType, MemberIdentity memberIdentity) => memberIdentity.MemberInfo != null ? entityType.FindProperty(memberIdentity.MemberInfo) : entityType.FindProperty(memberIdentity.Name);
/// <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 virtual Expression BindMember(string name, Type entityClrType, bool clientEval, out IPropertyBase propertyBase) => BindMember(MemberIdentity.Create(name), entityClrType, clientEval, out propertyBase);
private OwnedNavigationBuilder <TEntity, TRelatedEntity> OwnsManyBuilder <TRelatedEntity>(MemberIdentity navigation) where TRelatedEntity : class { InternalForeignKeyBuilder relationship; using (var batch = Builder.Metadata.Model.ConventionDispatcher.DelayConventions()) { relationship = navigation.MemberInfo == null ? Builder.HasOwnership(typeof(TRelatedEntity), navigation.Name, ConfigurationSource.Explicit) : Builder.HasOwnership(typeof(TRelatedEntity), (PropertyInfo)navigation.MemberInfo, ConfigurationSource.Explicit); relationship.IsUnique(false, ConfigurationSource.Explicit); relationship = (InternalForeignKeyBuilder)batch.Run(relationship.Metadata).Builder; } return(new OwnedNavigationBuilder <TEntity, TRelatedEntity>( Builder.Metadata, relationship.Metadata.DeclaringEntityType, relationship)); }
protected virtual InternalRelationshipBuilder WithOneBuilder( [CanBeNull] MemberInfo navigationMemberInfo, [CanBeNull] Action <NavigationBuilder> navigationConfiguration = null) => WithOneBuilder(MemberIdentity.Create(navigationMemberInfo), navigationConfiguration);
protected virtual InternalForeignKeyBuilder WithOneBuilder( [CanBeNull] MemberInfo navigationMemberInfo) => WithOneBuilder(MemberIdentity.Create(navigationMemberInfo));
private Expression TryExpand(Expression source, MemberIdentity member) { source = source.UnwrapTypeConversion(out var convertedType); if (!(source is EntityShaperExpression entityShaperExpression)) { return(null); } var entityType = entityShaperExpression.EntityType; if (convertedType != null) { entityType = entityType.GetRootType().GetDerivedTypesInclusive() .FirstOrDefault(et => et.ClrType == convertedType); if (entityType == null) { return(null); } } var navigation = member.MemberInfo != null ? entityType.FindNavigation(member.MemberInfo) : entityType.FindNavigation(member.Name); if (navigation == null) { return(null); } var targetEntityType = navigation.GetTargetType(); if (targetEntityType == null || (!targetEntityType.HasDefiningNavigation() && !targetEntityType.IsOwned())) { return(null); } var foreignKey = navigation.ForeignKey; if (navigation.IsCollection()) { var innerShapedQuery = CreateShapedQueryExpression( targetEntityType, _sqlExpressionFactory.SelectWithCrossDb(targetEntityType)); var makeNullable = foreignKey.PrincipalKey.Properties .Concat(foreignKey.Properties) .Select(p => p.ClrType) .Any(t => t.IsNullableType()); var innerSequenceType = innerShapedQuery.Type.TryGetSequenceType(); var correlationPredicateParameter = Expression.Parameter(innerSequenceType); var outerKey = entityShaperExpression.CreateKeyAccessExpression( navigation.IsDependentToPrincipal() ? foreignKey.Properties : foreignKey.PrincipalKey.Properties, makeNullable); var innerKey = correlationPredicateParameter.CreateKeyAccessExpression( navigation.IsDependentToPrincipal() ? foreignKey.PrincipalKey.Properties : foreignKey.Properties, makeNullable); var outerKeyFirstProperty = outerKey is NewExpression newExpression ? ((UnaryExpression)((NewArrayExpression)newExpression.Arguments[0]).Expressions[0]).Operand : outerKey; var predicate = outerKeyFirstProperty.Type.IsNullableType() ? Expression.AndAlso( Expression.NotEqual(outerKeyFirstProperty, Expression.Constant(null, outerKeyFirstProperty.Type)), Expression.Equal(outerKey, innerKey)) : Expression.Equal(outerKey, innerKey); var correlationPredicate = Expression.Lambda(predicate, correlationPredicateParameter); return(Expression.Call( QueryableMethods.Where.MakeGenericMethod(innerSequenceType), innerShapedQuery, Expression.Quote(correlationPredicate))); } var entityProjectionExpression = (EntityProjectionExpression) (entityShaperExpression.ValueBufferExpression is ProjectionBindingExpression projectionBindingExpression ? _selectExpression.GetMappedProjection(projectionBindingExpression.ProjectionMember) : entityShaperExpression.ValueBufferExpression); var innerShaper = entityProjectionExpression.BindNavigation(navigation); if (innerShaper == null) { var innerSelectExpression = _sqlExpressionFactory.SelectWithCrossDb(targetEntityType); var innerShapedQuery = CreateShapedQueryExpression(targetEntityType, innerSelectExpression); var makeNullable = foreignKey.PrincipalKey.Properties .Concat(foreignKey.Properties) .Select(p => p.ClrType) .Any(t => t.IsNullableType()); var outerKey = entityShaperExpression.CreateKeyAccessExpression( navigation.IsDependentToPrincipal() ? foreignKey.Properties : foreignKey.PrincipalKey.Properties, makeNullable); var innerKey = innerShapedQuery.ShaperExpression.CreateKeyAccessExpression( navigation.IsDependentToPrincipal() ? foreignKey.PrincipalKey.Properties : foreignKey.Properties, makeNullable); var joinPredicate = _sqlTranslator.Translate(Expression.Equal(outerKey, innerKey)); _selectExpression.AddLeftJoin(innerSelectExpression, joinPredicate, null); #pragma warning disable CA1826 // Do not use Enumerable methods on indexable collections. Instead use the collection directly var leftJoinTable = ((LeftJoinExpression)_selectExpression.Tables.Last()).Table; #pragma warning restore CA1826 // Do not use Enumerable methods on indexable collections. Instead use the collection directly innerShaper = new EntityShaperExpression( targetEntityType, new EntityProjectionExpression(targetEntityType, leftJoinTable, true), true); entityProjectionExpression.AddNavigationBinding(navigation, innerShaper); } return(innerShaper); }