/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void AddEntityConfiguration([NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); AddKeyConfiguration(entityConfiguration); AddTableNameConfiguration(entityConfiguration); AddIndexConfigurations(entityConfiguration); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public PropertyConfiguration( [NotNull] EntityConfiguration entityConfiguration, [NotNull] IProperty property) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); Check.NotNull(property, nameof(property)); EntityConfiguration = entityConfiguration; Property = property; }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void AddIndexConfigurations([NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); foreach (var index in entityConfiguration.EntityType.GetIndexes().Cast <Index>()) { AddIndexConfiguration(entityConfiguration, index); } }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void AddIndexConfiguration( [NotNull] EntityConfiguration entityConfiguration, [NotNull] Index index) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); Check.NotNull(index, nameof(index)); entityConfiguration.FluentApiConfigurations.Add( _configurationFactory.CreateIndexConfiguration("e", index)); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void AddEntityPropertiesConfiguration([NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); foreach (var property in ScaffoldingUtilities.OrderedProperties(entityConfiguration.EntityType)) { var propertyConfiguration = _configurationFactory.CreatePropertyConfiguration(entityConfiguration, property); AddPropertyConfiguration(propertyConfiguration); entityConfiguration.PropertyConfigurations.Add(propertyConfiguration); } }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void AddKeyConfiguration([NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); var entityType = (EntityType)entityConfiguration.EntityType; foreach (var key in entityType.GetKeys()) { if (key == null || key.Properties.Count == 0) { continue; } var conventionKeyProperties = _keyDiscoveryConvention.DiscoverKeyProperties(entityType, entityType.GetProperties().ToList()); if (conventionKeyProperties != null && key.Properties.OrderBy(p => p.Name).SequenceEqual(conventionKeyProperties.OrderBy(p => p.Name))) { continue; } if (key.IsPrimaryKey()) { var keyFluentApi = _configurationFactory .CreateKeyFluentApiConfiguration("e", key); if (key.Properties.Count == 1 && key.Relational().Name == RelationalKeyAnnotations .GetDefaultKeyName( entityType.Relational().TableName, true, /* is primary key */ key.Properties.Select(p => p.Relational().ColumnName))) { keyFluentApi.HasAttributeEquivalent = true; var propertyConfiguration = entityConfiguration.GetOrAddPropertyConfiguration( entityConfiguration, key.Properties.First()); propertyConfiguration.AttributeConfigurations.Add( _configurationFactory.CreateAttributeConfiguration(nameof(KeyAttribute))); } entityConfiguration.FluentApiConfigurations.Add(keyFluentApi); } } }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual PropertyConfiguration GetOrAddPropertyConfiguration( [NotNull] EntityConfiguration entityConfiguration, [NotNull] Property property) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); Check.NotNull(property, nameof(property)); var propertyConfiguration = FindPropertyConfiguration(property); if (propertyConfiguration == null) { propertyConfiguration = new PropertyConfiguration(entityConfiguration, property); PropertyConfigurations.Add(propertyConfiguration); } return(propertyConfiguration); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public RelationshipConfiguration( [NotNull] EntityConfiguration entityConfiguration, [NotNull] IForeignKey foreignKey, [NotNull] string dependentEndNavigationPropertyName, [NotNull] string principalEndNavigationPropertyName, DeleteBehavior onDeleteAction) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); Check.NotNull(foreignKey, nameof(foreignKey)); Check.NotEmpty(dependentEndNavigationPropertyName, nameof(dependentEndNavigationPropertyName)); Check.NotEmpty(principalEndNavigationPropertyName, nameof(principalEndNavigationPropertyName)); EntityConfiguration = entityConfiguration; ForeignKey = foreignKey; DependentEndNavigationPropertyName = dependentEndNavigationPropertyName; PrincipalEndNavigationPropertyName = principalEndNavigationPropertyName; OnDeleteAction = onDeleteAction; }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void AddNavigationPropertyInitializers([NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); foreach (var otherEntityType in entityConfiguration.EntityType.Model.GetEntityTypes().Where(et => et != entityConfiguration.EntityType)) { // find navigation properties for foreign keys from another EntityType which reference this EntityType foreach (var foreignKey in otherEntityType .GetForeignKeys().Where(fk => fk.PrincipalEntityType == entityConfiguration.EntityType)) { var navigationProperty = foreignKey.PrincipalToDependent; if (!foreignKey.IsUnique && navigationProperty != null) { entityConfiguration.NavigationPropertyInitializerConfigurations.Add( _configurationFactory.CreateNavigationPropertyInitializerConfiguration( navigationProperty.Name, otherEntityType.Name)); } } } }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void AddTableNameConfiguration([NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); var entityType = entityConfiguration.EntityType; if (AnnotationProvider.For(entityType).Schema != null && AnnotationProvider.For(entityType).Schema != AnnotationProvider.For(Model).DefaultSchema) { var delimitedTableName = CSharpUtilities.DelimitString(AnnotationProvider.For(entityType).TableName); var delimitedSchemaName = CSharpUtilities.DelimitString(AnnotationProvider.For(entityType).Schema); entityConfiguration.FluentApiConfigurations.Add( _configurationFactory.CreateFluentApiConfiguration( /* hasAttributeEquivalent */ true, nameof(RelationalEntityTypeBuilderExtensions.ToTable), delimitedTableName, delimitedSchemaName)); entityConfiguration.AttributeConfigurations.Add( _configurationFactory.CreateAttributeConfiguration( nameof(TableAttribute), delimitedTableName, nameof(TableAttribute.Schema) + " = " + delimitedSchemaName)); } else if (AnnotationProvider.For(entityType).TableName != null && AnnotationProvider.For(entityType).TableName != entityType.Scaffolding().DbSetName) { var delimitedTableName = CSharpUtilities.DelimitString(AnnotationProvider.For(entityType).TableName); entityConfiguration.FluentApiConfigurations.Add( _configurationFactory.CreateFluentApiConfiguration( /* hasAttributeEquivalent */ true, nameof(RelationalEntityTypeBuilderExtensions.ToTable), delimitedTableName)); entityConfiguration.AttributeConfigurations.Add( _configurationFactory.CreateAttributeConfiguration( nameof(TableAttribute), delimitedTableName)); } }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual string WriteCode( [NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); _entity = entityConfiguration; _sb = new IndentedStringBuilder(); _sb.AppendLine("using System;"); _sb.AppendLine("using System.Collections.Generic;"); if (!_entity.ModelConfiguration.CustomConfiguration.UseFluentApiOnly) { _sb.AppendLine("using System.ComponentModel.DataAnnotations;"); _sb.AppendLine("using System.ComponentModel.DataAnnotations.Schema;"); } foreach (var ns in _entity.EntityType.GetProperties() .Select(p => p.ClrType.Namespace) .Where(ns => ns != "System" && ns != "System.Collections.Generic") .Distinct()) { _sb .Append("using ") .Append(ns) .AppendLine(';'); } _sb.AppendLine(); _sb.AppendLine("namespace " + _entity.ModelConfiguration.Namespace()); _sb.AppendLine("{"); using (_sb.Indent()) { AddClass(); } _sb.AppendLine("}"); return _sb.ToString(); }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void AddRelationshipConfiguration([NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); foreach (var foreignKey in entityConfiguration.EntityType.GetForeignKeys()) { var dependentEndNavigationProperty = foreignKey.DependentToPrincipal; var principalEndNavigationProperty = foreignKey.PrincipalToDependent; if (dependentEndNavigationProperty != null && principalEndNavigationProperty != null) { var relationshipConfiguration = _configurationFactory .CreateRelationshipConfiguration( entityConfiguration, foreignKey, dependentEndNavigationProperty.Name, principalEndNavigationProperty.Name, foreignKey.DeleteBehavior); relationshipConfiguration.HasAttributeEquivalent = foreignKey.PrincipalKey.IsPrimaryKey(); entityConfiguration.RelationshipConfigurations.Add(relationshipConfiguration); } } }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual void AddNavigationProperties([NotNull] EntityConfiguration entityConfiguration) { Check.NotNull(entityConfiguration, nameof(entityConfiguration)); foreach (var otherEntityType in entityConfiguration.EntityType .Model.GetEntityTypes().Where(et => et != entityConfiguration.EntityType)) { // set up the navigation properties for foreign keys from another EntityType // which reference this EntityType (i.e. this EntityType is the principal) foreach (var foreignKey in otherEntityType .GetForeignKeys().Where(fk => fk.PrincipalEntityType == entityConfiguration.EntityType)) { var principalNavProp = foreignKey.PrincipalToDependent; if (principalNavProp != null) { var referencedType = foreignKey.IsUnique ? otherEntityType.Name : "ICollection<" + otherEntityType.Name + ">"; var navPropConfiguration = _configurationFactory.CreateNavigationPropertyConfiguration( referencedType, principalNavProp.Name); var dependentNavProp = foreignKey.DependentToPrincipal; if (foreignKey.PrincipalKey.IsPrimaryKey() && dependentNavProp != null) { navPropConfiguration.AttributeConfigurations.Add( _configurationFactory.CreateAttributeConfiguration( nameof(InversePropertyAttribute), CSharpUtilities.DelimitString(dependentNavProp.Name))); } entityConfiguration.NavigationPropertyConfigurations.Add(navPropConfiguration); } } } foreach (var foreignKey in entityConfiguration.EntityType.GetForeignKeys()) { // set up the navigation property on this end of foreign keys owned by this EntityType // (i.e. this EntityType is the dependent) var dependentNavProp = foreignKey.DependentToPrincipal; if (dependentNavProp != null) { var dependentEndNavPropConfiguration = _configurationFactory.CreateNavigationPropertyConfiguration( foreignKey.PrincipalEntityType.Name, dependentNavProp.Name); var principalNavProp = foreignKey.PrincipalToDependent; if (foreignKey.PrincipalKey.IsPrimaryKey() && principalNavProp != null) { dependentEndNavPropConfiguration.AttributeConfigurations.Add( _configurationFactory.CreateAttributeConfiguration( nameof(ForeignKeyAttribute), CSharpUtilities.DelimitString( string.Join(",", foreignKey.Properties.Select(p => p.Name))))); dependentEndNavPropConfiguration.AttributeConfigurations.Add( _configurationFactory.CreateAttributeConfiguration( nameof(InversePropertyAttribute), CSharpUtilities.DelimitString(principalNavProp.Name))); } entityConfiguration.NavigationPropertyConfigurations.Add( dependentEndNavPropConfiguration); // set up the other navigation property for self-referencing foreign keys owned by this EntityType if (((ForeignKey)foreignKey).IsSelfReferencing() && principalNavProp != null) { var referencedType = foreignKey.IsUnique ? foreignKey.DeclaringEntityType.Name : "ICollection<" + foreignKey.DeclaringEntityType.Name + ">"; var principalEndNavPropConfiguration = _configurationFactory.CreateNavigationPropertyConfiguration( referencedType, principalNavProp.Name); principalEndNavPropConfiguration.AttributeConfigurations.Add( _configurationFactory.CreateAttributeConfiguration( nameof(InversePropertyAttribute), CSharpUtilities.DelimitString(dependentNavProp.Name))); entityConfiguration.NavigationPropertyConfigurations.Add( principalEndNavPropConfiguration); } } } }