日期:2014-05-16  浏览次数:20375 次

Entity Framework Database/Code First实现对表进行压缩配置

我采用Database First,用Sql很容易就可以做到对一个表进行压缩。如以下:

CREATE TABLE [dbo].[Entities](
     [Id] [int] IDENTITY(1,1) NOT NULL,
     [Name] [nvarchar](max) NULL,

     Primary Key Clustered ([Id] ASC) WITH (DATA_COMPRESSION=PAGE)
 );

遗憾的是当我采用Database First反向之后。再利用反向后的DbContext(我命名为MyContext)自动生成另外一个数据库时,我发现新生成的数据库里并没有对Entities这个表进行Page级别的压缩,或者说压根就没有压缩。

因为在同一个MyContext下我要求可以自动生成新的数据库。Database First反向之后,再利用DbContext去生成新的数据库,这就有点类似于Code Frist了。一开始,我是打算override OnModelCreating(DbModelBuilder modelBuilder)在这里实现的。两方面的原因让我发现做不到。首先,我没能找到相应的C#版本的Api;其次,如同这个方法的名称一样,在模型的创建时,相关的表还没有建立出来,因此我无法对表进行修改。

最后,我只能采用另一种方式了。继承 CreateDatabaseIfNotExists类,并override Seed(MyContext context)方法了。这个方法的执行时间是在数据库第一次生成之后。这个时候是最适合对表进行修改的。具体如下:

  public class CreateDatabaseWithCompressionIfNotExists : CreateDatabaseIfNotExists<MyContext>
    {
        protected override void Seed(testEntities context)
        {
            var cmd = new SqlCommand();
            var con = new SqlConnection(context.Database.Connection.ConnectionString);
            con.Open();
            cmd.Connection = con;
            cmd.CommandType = CommandType.Text;

            cmd.CommandText = "alter table entities rebuild with (data_compression=page);";

            cmd.ExecuteNonQuery();
        }
    }
Main函数里的调用 :
 private static void Main(string[] args)
        {
            Database.SetInitializer(new CreateDatabaseWithCompressionIfNotExists());
 //这里就会调用实现对表的修改了。
            var test = new testEntities();
            test.Entities.Add(new Model.Entity());
            test.SaveChanges();
        }



具体查看是否进行压缩的一种方式:
在:Microsoft SQL SERVER Management Studio里 "右键"相应的表->Properties->Storage->Compresion 这里可以看到相应的Compression type


具体查看是否进行压缩的一种方式:
在:Microsoft SQL SERVER Management Studio里 "右键"相应的表->Properties->Storage->Compresion 这里可以看到相应的Compression type