Set database collation in Entity Framework Code-First Initializer

后端 未结 8 1308
后悔当初
后悔当初 2020-12-01 12:26

I want to set the default collation for a database, when Entity Framework Code First creates it.

I\'ve tried the following:

public class TestInitiali         


        
8条回答
  •  眼角桃花
    2020-12-01 13:05

    My solution with EFCore was to derive from the SqlServerMigrationsSqlGenerator and override Generate(SqlServerCreateDatabaseOperation, IModel, MigrationCommandListBuilder)

        internal class CustomSqlServerMigrationsSqlGenerator : SqlServerMigrationsSqlGenerator
        {
            internal const string DatabaseCollationName = "SQL_Latin1_General_CP1_CI_AI";
    
            public CustomSqlServerMigrationsSqlGenerator(
                MigrationsSqlGeneratorDependencies dependencies,
                IMigrationsAnnotationProvider migrationsAnnotations)
            : base(dependencies, migrationsAnnotations)
            {
            }
    
            protected override void Generate(
                SqlServerCreateDatabaseOperation operation,
                IModel model,
                MigrationCommandListBuilder builder)
            {
                base.Generate(operation, model, builder);
    
                if (DatabaseCollationName != null)
                {
                    builder
                        .Append("ALTER DATABASE ")
                        .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name))
                        .Append(" COLLATE ")
                        .Append(DatabaseCollationName)
                        .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator)
                        .EndCommand(suppressTransaction: true);
                }
            }
        }
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.ReplaceService();
        }
    

    then used it in the DbContext by replacing the IMigrationsSqlGenerator service

    public class MyDbContext : DbContext
    {
        //...
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.ReplaceService();
        }
    
        //...
    }
    

提交回复
热议问题