如何让Entity Framework Code First生成的SQL Server表启用DATA_COMPRESSION=PAGE?
EF Code First 全局启用SQL Server表PAGE压缩的最优方案
推荐方案:自定义SqlServerMigrationSqlGenerator
这是最省心的全局解决方案,直接修改EF迁移生成SQL的逻辑,让所有新建表自动启用页压缩,无需手动干预每个迁移文件。
实现步骤
- 创建自定义SQL生成器类,继承
SqlServerMigrationSqlGenerator并重写创建表的逻辑:
using System.Data.Entity.Migrations.Model; using System.Data.Entity.Migrations.Sql; public class CompressedSqlServerMigrationSqlGenerator : SqlServerMigrationSqlGenerator { protected override void Generate(CreateTableOperation createTableOperation) { // 先执行默认的CREATE TABLE逻辑 base.Generate(createTableOperation); // 追加启用页压缩的ALTER TABLE语句 Sql($"ALTER TABLE {createTableOperation.Name} REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE);"); } }
- 在迁移配置类中注册这个自定义生成器:
internal sealed class YourDbContextMigrationConfiguration : DbMigrationsConfiguration<YourDbContext> { public YourDbContextMigrationConfiguration() { AutomaticMigrationsEnabled = false; // 注册SQL Server的自定义生成器 SetSqlGenerator("System.Data.SqlClient", new CompressedSqlServerMigrationSqlGenerator()); } }
这个方案的优势:
- 一劳永逸,后续新增实体生成的迁移会自动给表加页压缩
- 完全适配Code First迁移流程,不破坏现有工作流
- 无需手动修改迁移文件,避免遗漏
备选方案:手动修改迁移文件(临时/局部场景)
如果只是针对个别表或者临时需求,可以在自动生成的迁移文件中,在CreateTable之后手动添加压缩语句:
public override void Up() { CreateTable( "dbo.Product", c => new { Id = c.Int(nullable: false, identity: true), Name = c.String(), Price = c.Decimal(nullable: false, precision: 18, scale: 2) }) .PrimaryKey(t => t.Id); // 手动添加页压缩配置 Sql("ALTER TABLE dbo.Product REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE);"); }
缺点是每次新增表都要手动操作,容易遗漏,不适合全局长期需求。
注意事项
- 页压缩仅支持SQL Server Enterprise版、Developer版或Evaluation版,Express版不支持该特性,使用前请确认版本
- 对于已存在的未压缩表,需要创建空迁移,在
Up方法中执行ALTER TABLE语句来开启压缩
内容的提问来源于stack exchange,提问作者beseus
相关产品推荐
相关产品推荐

