Repository: dotnet/efcore
File: src/EFCore.SqlServer/Migrations/SqlServerMigrationsSqlGenerator.cs (C#)

Code before:
    protected override void ColumnDefinition(
        string? schema,
        string table,
        string name,
        ColumnOperation operation,
        IModel? model,
        MigrationCommandListBuilder builder)
    {
        if (operation.ComputedColumnSql != null)
        {
            ComputedColumnDefinition(schema, table, name, operation, model, builder);

            return;
        }

        var columnType = operation.ColumnType ?? GetColumnType(schema, table, name, operation, model);
        builder
            .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(name))
            .Append(" ")
            .Append(columnType);

        if (operation.Collation != null)
        {
            // SQL Server collation docs: https://learn.microsoft.com/sql/relational-databases/collations/collation-and-unicode-support

            // The default behavior in QuerySqlGenerator is to quote collation names, but SQL Server does not support that.
            // Instead, make sure the collation name only contains a restricted set of characters.
            foreach (var c in operation.Collation)
            {
                if (!char.IsLetterOrDigit(c) && c != '_')
                {
                    throw new InvalidOperationException(SqlServerStrings.InvalidCollationName(operation.Collation));
                }
            }

            builder
                .Append(" COLLATE ")
                .Append(operation.Collation);
        }

        if (operation[SqlServerAnnotationNames.Sparse] is bool isSparse && isSparse)
        {
            builder.Append(" SPARSE");
        }

        var isPeriodStartColumn = operation[SqlServerAnnotationNames.TemporalIsPeriodStartColumn] as bool? == true;
        var isPeriodEndColumn = operation[SqlServerAnnotationNames.TemporalIsPeriodEndColumn] as bool? == true;

        if (isPeriodStartColumn || isPeriodEndColumn)
        {
            builder.Append(" GENERATED ALWAYS AS ROW ");

Review comment (suggestion):
The comment refers to "The default behavior in QuerySqlGenerator" but this code is in MigrationsSqlGenerator. While the comment is technically accurate about the base class behavior, it would be clearer to reference "MigrationsSqlGenerator" to match the context, or say "the base class" for consistency.
```suggestion
            // The default behavior in the base class is to quote collation names, but SQL Server does not support that.
```

Code after:
    protected override void ColumnDefinition(
        string? schema,
        string table,
        string name,
        ColumnOperation operation,
        IModel? model,
        MigrationCommandListBuilder builder)
    {
        if (operation.ComputedColumnSql != null)
        {
            ComputedColumnDefinition(schema, table, name, operation, model, builder);

            return;
        }

        var columnType = operation.ColumnType ?? GetColumnType(schema, table, name, operation, model);
        builder
            .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(name))
            .Append(" ")
            .Append(columnType);

        if (operation.Collation != null)
        {
            // SQL Server collation docs: https://learn.microsoft.com/sql/relational-databases/collations/collation-and-unicode-support

            // The default behavior in MigrationsSqlGenerator is to quote collation names, but SQL Server does not support that.
            // Instead, make sure the collation name only contains a restricted set of characters.
            foreach (var c in operation.Collation)
            {
                if (!char.IsLetterOrDigit(c) && c != '_')
                {
                    throw new InvalidOperationException(SqlServerStrings.InvalidCollationName(operation.Collation));
                }
            }

            builder
                .Append(" COLLATE ")
                .Append(operation.Collation);
        }

        if (operation[SqlServerAnnotationNames.Sparse] is bool isSparse && isSparse)
        {
            builder.Append(" SPARSE");
        }

        var isPeriodStartColumn = operation[SqlServerAnnotationNames.TemporalIsPeriodStartColumn] as bool? == true;
        var isPeriodEndColumn = operation[SqlServerAnnotationNames.TemporalIsPeriodEndColumn] as bool? == true;

        if (isPeriodStartColumn || isPeriodEndColumn)
        {
            builder.Append(" GENERATED ALWAYS AS ROW ");