/// <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;
            }
        }