/// <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> protected override void ValidateSharedColumnsCompatibility( IReadOnlyList <IEntityType> mappedTypes, string tableName, DiagnosticsLoggers loggers) { base.ValidateSharedColumnsCompatibility(mappedTypes, tableName, loggers); var identityColumns = new List <IProperty>(); var propertyMappings = new Dictionary <string, IProperty>(); foreach (var property in mappedTypes.SelectMany(et => et.GetDeclaredProperties())) { var propertyAnnotations = property.Relational(); var columnName = propertyAnnotations.ColumnName; if (propertyMappings.TryGetValue(columnName, out var duplicateProperty)) { var propertyStrategy = property.SqlServer().ValueGenerationStrategy; var duplicatePropertyStrategy = duplicateProperty.SqlServer().ValueGenerationStrategy; if (propertyStrategy != duplicatePropertyStrategy && (propertyStrategy == SqlServerValueGenerationStrategy.IdentityColumn || duplicatePropertyStrategy == SqlServerValueGenerationStrategy.IdentityColumn)) { throw new InvalidOperationException( SqlServerStrings.DuplicateColumnNameValueGenerationStrategyMismatch( duplicateProperty.DeclaringEntityType.DisplayName(), duplicateProperty.Name, property.DeclaringEntityType.DisplayName(), property.Name, columnName, tableName)); } } else { propertyMappings[columnName] = property; if (property.SqlServer().ValueGenerationStrategy == SqlServerValueGenerationStrategy.IdentityColumn) { identityColumns.Add(property); } } } if (identityColumns.Count > 1) { var sb = new StringBuilder() .AppendJoin(identityColumns.Select(p => "'" + p.DeclaringEntityType.DisplayName() + "." + p.Name + "'")); throw new InvalidOperationException(SqlServerStrings.MultipleIdentityColumns(sb, tableName)); } }
/// <inheritdoc /> protected override void ValidateCompatible( IProperty property, IProperty duplicateProperty, string columnName, string tableName, string schema, IDiagnosticsLogger <DbLoggerCategory.Model.Validation> logger) { base.ValidateCompatible(property, duplicateProperty, columnName, tableName, schema, logger); var propertyStrategy = property.GetValueGenerationStrategy(tableName, schema); var duplicatePropertyStrategy = duplicateProperty.GetValueGenerationStrategy(tableName, schema); if (propertyStrategy != duplicatePropertyStrategy) { throw new InvalidOperationException( SqlServerStrings.DuplicateColumnNameValueGenerationStrategyMismatch( duplicateProperty.DeclaringEntityType.DisplayName(), duplicateProperty.Name, property.DeclaringEntityType.DisplayName(), property.Name, columnName, tableName)); } switch (propertyStrategy) { case SqlServerValueGenerationStrategy.IdentityColumn: var increment = property.GetIdentityIncrement(); var duplicateIncrement = duplicateProperty.GetIdentityIncrement(); if (increment != duplicateIncrement) { throw new InvalidOperationException( SqlServerStrings.DuplicateColumnIdentityIncrementMismatch( duplicateProperty.DeclaringEntityType.DisplayName(), duplicateProperty.Name, property.DeclaringEntityType.DisplayName(), property.Name, columnName, tableName)); } var seed = property.GetIdentitySeed(); var duplicateSeed = duplicateProperty.GetIdentitySeed(); if (seed != duplicateSeed) { throw new InvalidOperationException( SqlServerStrings.DuplicateColumnIdentitySeedMismatch( duplicateProperty.DeclaringEntityType.DisplayName(), duplicateProperty.Name, property.DeclaringEntityType.DisplayName(), property.Name, columnName, tableName)); } break; case SqlServerValueGenerationStrategy.SequenceHiLo: if (property.GetHiLoSequenceName() != duplicateProperty.GetHiLoSequenceName() || property.GetHiLoSequenceSchema() != duplicateProperty.GetHiLoSequenceSchema()) { throw new InvalidOperationException( SqlServerStrings.DuplicateColumnSequenceMismatch( duplicateProperty.DeclaringEntityType.DisplayName(), duplicateProperty.Name, property.DeclaringEntityType.DisplayName(), property.Name, columnName, tableName)); } break; } }