You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Entity Framework Code First生成的SQL Server表启用DATA_COMPRESSION=PAGE?

EF Code First 全局启用SQL Server表PAGE压缩的最优方案

推荐方案:自定义SqlServerMigrationSqlGenerator

这是最省心的全局解决方案,直接修改EF迁移生成SQL的逻辑,让所有新建表自动启用页压缩,无需手动干预每个迁移文件。

实现步骤

  1. 创建自定义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);");
    }
}
  1. 在迁移配置类中注册这个自定义生成器:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:08:19